使用mysql主從複製的好處有:
1、採用主從服務器這種架構,穩定性得以提升。如果主服務器發生故障,我們可以使用從服務器來提供服務。
2、在主從服務器上分開處理用戶的請求,可以提升數據處理效率。
3、將主服務器上的數據複製到從服務器上,保護數據免受意外的損失。
下面是我在實際工作過程中所整理的筆記
一、MySQL的安裝與配置
值得一提的是,我的安裝過程都是源碼包編譯安裝的,並且所有的配置與數據等都統一規劃到了/usr/local/mysql目錄中,因此在一臺服務器上安裝完成以後,可以將整個mysql目錄打包,然後傳到其它服務器上解包,便可立即使用。
二、MySQL主從複製(全部複製)
場景描述:
主數據庫服務器:192.168.10.130,MySQL已經安裝,並且無應用數據。
從數據庫服務器:192.168.10.131,MySQL已經安裝,並且無應用數據。
2.1 主服務器上進行的操作
1 2 3 4 | $ vi /usr/local/mysql/etc/my .cnf
[mysqld]
log-bin=mysql-bin // [必須]啓用二進制日誌
server- id =130 // [必須]服務器唯一ID,默認是1,一般取IP最後一段
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | #啓動mysql服務
/usr/local /mysql/init
.d /mysql start
#通過命令行登錄管理MySQL服務器
/usr/local /mysql/bin/mysql -uroot -p 'new-password'
#授權給從數據庫服務器192.168.10.131
mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1' @ '192.168.10.131' identified by ‘password’;
#查詢主數據庫狀態
Mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 261 | | |
+------------------+----------+--------------+------------------+
|
記錄下 FILE 及 Position 的值,在後面進行從服務器操作的時候需要用到。
2.2 配置從服務器
1 2 3 4 | $ vi /usr/local /mysql/etc/my
.cnf
[mysqld]
log-bin=mysql-bin // [必須]啓用二進制日誌
server- id =131 // [必須]服務器唯一ID,默認是1,一般取IP最後一段
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #啓動mysql服務
/usr/local /mysql/init
.d /mysql start
#通過命令行登錄管理MySQL服務器
/usr/local /mysql/bin/mysql -uroot -p 'new-password'
#執行同步SQL語句
mysql> change master to
master_host=’192.168.10.130’,
master_user=’rep1’,
master_password=’password’,
master_log_file=’mysql-bin.000005’,
master_log_pos=261;
#正確執行後啓動Slave同步進程
mysql> start slave;
#主從同步檢查
mysql> show slave status\G
==============================================
**************** 1. row *******************
Slave_IO_State:
Master_Host: 192.168.10.130
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 415
Relay_Log_File: localhost-relay-bin.000008
Relay_Log_Pos: 561
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: YES
Slave_SQL_Running: YES
Replicate_Do_DB:
……………省略若干……………
Master_Server_Id: 1
1 row in set (0.01 sec)
==============================================
|
其中Slave_IO_Running 與 Slave_SQL_Running 的值都必須爲YES,才表明狀態正常。
注意:如果主服務器已經存在應用數據,則在進行主從複製時,需要做以下處理:
(1)主數據庫進行鎖表操作,不讓數據再進行寫入動作
mysql> FLUSH TABLES WITH READ LOCK;
(2)查看主數據庫狀態
mysql> show master status;
(3)記錄下 FILE 及 Position 的值。
將主服務器的數據文件(整個/usr/local/mysql/data目錄)複製到從服務器,建議通過tar歸檔壓縮後再傳到從服務器解壓。
(4)取消主數據庫鎖定
mysql> UNLOCK TABLES;
2.3 驗證主從複製效果
主服務器上的操作
1 2 3 4 5 6 7 8 9 | #在主服務器上創建數據庫first_db
mysql> create database first_db;
Query Ok, 1 row affected (0.01 sec)
#在主服務器上創建表first_tb
mysql> create table first_tb( id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
#在主服務器上的表first_tb中插入記錄
mysql> insert into first_tb values (001,’myself’);
Query Ok, 1 row affected (0.00 sec)
|
在從服務器上查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | mysql> show databases;
=============================
+--------------------+
| Database |
+--------------------+
| information_schema |
| first_db |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
=============================
#數據庫first_db已經自動生成
mysql> use first_db
Database chaged
mysql> show tables;
=============================
+--------------------+
| Tables_in_first_db |
+--------------------+
| first_tb |
+--------------------+
1 row in set (0.02 sec)
=============================
#數據庫表first_tb也已經自動創建
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
#記錄也已經存在
|
由此,整個MySQL主從複製的過程就完成了。
三、MySQL主從複製複製部分庫或表
這裏跟全部複製不同的是主從服務器修改/etc/my.cnf配置的地方,這裏只介紹不同的情況。
3.1 主服務器的配置
1 2 3 4 5 6 | #在/etc/my.cnf配置文件:
log-bin=mysql-bin # 啓動二進制日誌系統
server- id =130 # 本機數據庫唯一ID
log-bin= /var/log/mysql/updatelog # 設定生成log文件名,這裏的路徑沒有要手動創建並給它mysql用戶的權限。
binlog- do -db=test1 # 二進制需要同步的數據庫名
binlog-ignore-db=mysql, test # 避免同步mysql用戶配置,以免不必要的麻煩
|
3.2 從服務器的配置
1 2 3 4 5 6 7 8 9 10 | #修改/etc/my.cnf 文件:
server- id =131 #從服務器ID號,不要和主ID相同
master-host=192.168.20.155 #指定主服務器IP地址
master-user=replication #指定在主服務器上可以進行同步的用戶名
master-password=123456 #密碼
master-port=3306 # 同步所用端口
master-connect-retry=60 #斷點從新連接時間
replicate-ignore-db=mysql #屏蔽對mysql庫的同步
replicate- do -db=test1 #同步的數據庫的名稱
replicate_do_table = testa #同步的數據表的名稱
|
replicate部分也可以這樣寫:
1 2 3 | replicate- do -table=數據庫名.表名
#如果要是複製多個表只要在下面直接添加(複製幾個就添加幾個)
replicate- do -table=數據庫名.表名
|
mysql replication單表或多表複製時需注意的幾個問題:
1.主庫和從庫的數據庫名必須相同;
2.主庫和從庫的複製可以精確到表,但是在需要更改主庫或從庫的數據結構時需要立刻重啓slave;
3.不能在mysql配置文件裏直接寫入master的配置信息,需要用change master命令來完成;
4.指定replicate_do_db必須在my.ini裏配置,不能用change master命令來完成;
5.如果不及時清理,日積月累二進制日誌文件可能會把磁盤空間佔滿,可以在配置文件里加上expire_logs_days=7,只保留最近7天的日誌,建議當slave不再使用時,通過reset slave來取消relaylog;