[root@m1 ~]# more /etc/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html [mysqld] server-id = 1 datadir = /var/lib/mysql log_bin = /var/lib/mysql/bin-log socket = /var/lib/mysql/mysql.sock slave_net_timeout = 60 log-slave-updates slave-skip-errors=all skip-name-resolve sync_binlog=1 auto_increment_increment=2 auto_increment_offset=1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #salve-net-timeout默認是3600秒,縮短時間是為了防止雙YES的假象 #(事實上我已遇到,參考地址:http://www.cnblogs.com/billyxp/p/3470376.html) 如果要指定同步或不同步哪些庫,可使用如下參數 #binlog-do-db=osyunweidb #需要同步的數據庫名,如果有多個數據庫,可重復此參數,每個數據庫一行 #binlog-ignore-db=mysql #不同步mysql系統數據庫
至於這些參數的說明具體看手冊。 紅色的部分非常重要,如果一個MASTER 掛掉的話,另外一個馬上接管。 紫紅色的部分指的是服務器頻繁的刷新日志。這個保證了在其中一台掛掉的話,日志刷新到另外一台。從而保證了數據的同步 2、確認bin-log與server-id是否開啟: 查看命令 show variables like 'log_bin'; show variables like 'server_id';
mysql> show variables like 'log_bin'; +---------------+-------+ |Variable_name | Value | +---------------+-------+ |log_bin | ON | +---------------+-------+ 1 rowin set (0.00 sec) mysql>show variables like 'server_id'; +---------------+-------+ |Variable_name | Value | +---------------+-------+ |server_id | 1 | +---------------+-------+ 1 rowin set (0.00 sec)
3、創建復制授權用戶 mysql> grant replication slave on *.* to replication@'%'identified by '123456'; #授權該用戶對所有表都能進行復制 mysql>flush privileges; #刷新權限 4、鎖表,記錄log-bin文件名和位置
mysql>flush tables with read lock; #鎖定所有表,此時數據庫不能寫入數據 QueryOK, 0 rows affected (0.05 sec) mysql>show master status; #查看最新bin-log文件及位置 +------------------------+------------+-------------------+-------------------------+ |File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------------+------------+-------------------+-------------------------+ |mysql-bin.000001 | 26314 | | | +------------------------+------------+-------------------+-------------------------+ 1row in set (0.00 sec)
5、鎖表狀態全備mysql數據 由於退出當前mysql登陸窗口,鎖表功能就失效,需克隆一個會話進行全備。 #mysqldump-uroot -p -A -B > /tmp/mysql_bak_2015_11_17.sql 看下備份數據大小,確認備份成功。 [root@m1 ~]# ls -l mysql_bak_2015_11_17.sql -rw-r--r--. 1 root root 645327 Nov 18 06:27 mysql_bak_2015_11_17.sql [root@m1 ~]# 6、解除鎖表 mysql>unlock tables; 或直接quit退出即可。 7、從庫開啟bin-log功能,配置server-id 從庫開啟bin-log功能後,待會在主上在配置同步,互為主從就完成了。
[root@m2 ~]# vi /etc/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html [mysqld] server-id = 2 datadir = /var/lib/mysql log_bin = /var/lib/mysql/mysql-bin socket = /var/lib/mysql/mysql.sock slave_net_timeout = 60 log-slave-updates slave-skip-errors=all skip-name-resolve sync_binlog=1 auto_increment_increment=2 auto_increment_offset=2 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #salve-net-timeout默認是3600秒,縮短時間是為了防止雙YES的假象
# 至於這些參數的說明具體看手冊。 紅色的部分非常重要,如果一個MASTER 掛掉的話,另外一個馬上接管。 紫紅色的部分指的是服務器頻繁的刷新日志。這個保證了在其中一台掛掉的話,日志刷新到另外一台。從而保證了數據的同步 #/etc/init.d/mysql restart 8、確認從庫bin-log與server-id是否開啟 查看命令 show variables like 'log_bin'; show variables like 'server_id';
mysql>show variables like 'log_bin'; +---------------+-------+ |Variable_name | Value | +---------------+-------+ |log_bin | ON | +---------------+-------+ 1row in set (0.00 sec) mysql>show variables like 'server_id'; +---------------+-------+ |Variable_name | Value | +---------------+-------+ |server_id | 2 | +---------------+-------+ 1row in set (0.00 sec)
9、從庫導入主庫的全備數據 登陸mysql導入數據 mysql>source /root/mysql_bak_2015_11_17.sql 10、記錄從庫bin-log信息 因為在從庫導入全備數據時,此時主庫與從庫的內容是一致的,但是bin-log位置不一定一致。
mysql>show master status; #查看最新bin-log文件及位置 +------------------------+------------+-------------------+-------------------------+ |File |Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------------+------------+-------------------+-------------------------+ |mysql-bin.000003 | 2328055 | | | +------------------------+------------+-------------------+-------------------------+ 1row in set (0.00 sec)
11、從庫設置同步主庫 此處binlog文件與位置狀態,是主庫在步驟4鎖表時show master status查看的位置狀態。
CHANGE MASTER TO MASTER_HOST='10.8.1.11', MASTER_PORT=3306, MASTER_USER='replication', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=26314;
12、開啟從庫同步並確認同步是否成功 使用start slave開啟同步功能,使用show slave status\G查看同步是否成功
mysql>start slave; QueryOK, 0 rows affected (0.00 sec) mysql>show slave status\G #\G不按表格輸出 ***************************1. row *************************** Slave_IO_State: Waiting formaster to send event Master_Host: 10.0.0.2 Master_User: replication Master_Port: 8306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 136270 Relay_Log_File:mysqld-relay-bin.000002 Relay_Log_Pos: 72697 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running:Yes Slave_SQL_Running:Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 98758 Relay_Log_Space: 110366 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 622 #查看主從同步延遲,延遲大則可能需要優化 Master_SSL_Verify_Server_Cert:No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1row in set (0.00 sec)
#sql線程與IO線程都是YES,slave配置成功。 13、主庫設置同步從庫 由於從庫是全備導入,原先在主庫上配置的復制帳戶也同樣導入,所以這裡不用在從庫上新授權復制用戶。 從庫上的binlog文件與位置狀態,是從庫在剛導入時show master status查看到的位置狀態。
CHANGEMASTER TO MASTER_HOST='10.8.1.12', MASTER_PORT=3306, MASTER_USER='replication', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2328055; #修改相應信息,直接把這些配置在mysql中粘貼即可。
14、開啟同步並確認同步是否成功 使用start slave開啟同步功能,使用show slave status\G查看同步是否成功
mysql>start slave; QueryOK, 0 rows affected (0.00 sec) mysql>show slave status\G ***************************1. row *************************** Slave_IO_State: Waiting formaster to send event Master_Host: 172.16.0.2 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 107 Relay_Log_File:mysqld-relay-bin.000006 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running:Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 556 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert:No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1row in set (0.00 sec)
#IO線程與sql線程都是正常。 15、互為主從測試 在兩台mysql各創建一個庫,看兩邊是否都能進行同步。 分別在主庫上執行 create database test01; 從庫上執行create database test02; 看兩台數據庫上執行show databases;,看是否都有test01表和test02表。 我的經過測試,雙主測試成功。