MySQL双机热备份
系统: CentOS release 6.6 (Final)
MySQL: mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
主从双机热备份,master <=> slave,任何一方增删改的数据都会被同步到另一方。假设A有数据库 test,ip地址为192.168.0.110,现在要将B建立起与A的双机热备份,ip地址为192.168.1.120。
1、注意事项
a.主机的mysql版本不能高于从机的mysql版本,可以是一样的。
b.主机和从机的mysql使用的端口号必须是一样的。
2、打开AB防火墙的3306端口:
sudo iptables -I IINPUT -p tcp --dport 3306 -j ACCEPT sudo service iptables save
3、设置MySQL复制用户:
Server A
grant replcation slave on *.* to 'dbrep'@'192.168.0.110';
Server B
grant replcation slave on *.* to 'dbrep'@'192.168.0.120';
4、配置mysql
Server A:
sudo vim /etc/my.cnf #添加到[mysqld]部分 [mysqld] #... server-id=1 log-bin=mysql-log-bin binlog_format=mixed binlog-ignore-db=mysql binlog-ignore-db=information_schema replicate-do-db=test relay-log=mysql-relay-log log-slave-updates=true read-only=0 auto-increment-increment=2 auto-increment-offset=1
Server B:
sudo vim /etc/my.cnf #添加到[mysqld]部分 [mysqld] #... server-id=2 log-bin=mysql-log-bin binlog_format=mixed binlog-ignore-db=mysql binlog-ignore-db=information_schema replicate-do-db=test relay-log=mysql-relay-log log-slave-updates=true read-only=0 auto-increment-increment=2 auto-increment-offset=2
注释:
第一组,每个mysql server设定不同的server-id以区分,log-bin指定二进制日志的命名,保存的格式是mixed。
第二组,忽略不保存mysql\information_schema的二进制日志。
第三组,执行更改的数据库。
第四组,防止AB都写数据时发生冲突,设置id auto-increment的步进是2,偏移分别为1和2。这里只有两台服务器,如果有多台则可增大步进,并分别设定各自的偏移。
以上参数详见MySQL manual 复制配置部分.
重启mysqld,使配置生效。
5、从A复制数据到B,保持两者初态的数据相同。
Server A
mysql> flush tables with read lock;
mysqldump -uroot -p iksdb > dbtest.sql
mysql -uroot -p
注:多个数据库,mysqldump -uroot -p --databases test test2 test3 > dbtest123.sql。所有数据库,mysqldump -uroot -p --all-database > dball.sql。某个数据库的表,mysqldump -uroot -p db1 db1_tb1 db1_tb2 > db1_tb1_tb2.sql
Server B
mysql -uroot -p test < dbtest.sql
6、建立A到B的复制
Server A MySQL shell
mysql> show master status; +----------------------+----------+--------------+--------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------------+----------+--------------+--------------------------+ | mysql-log-bin.000003 | 2526733 | | mysql,information_schema | +----------------------+----------+--------------+--------------------------+ 1 row in set (0.00 sec) mysql> unlock tables;
注:在备份数据库到show master status期间,要保持数据库的锁定状态,防止数据的改变,导致因为初态不一致产生的复制错误。
Server B MySQL shell
mysql> change master to -> master_host='192.168.0.110', -> master_user='dbrep', -> master_password='123456', -> master_log_file='mysql-log-bin.000003', -> master_log_pos=2526733; mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql> show master status\G *************************** 1. row *************************** File: mysql-log-bin.000001 Position: 518 Binlog_Do_DB: Binlog_Ignore_DB: mysql,information_schema 1 row in set (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.110 Master_User: dbrep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-log-bin.000003 Read_Master_Log_Pos: 2526733 Relay_Log_File: mysql-relay-log.000210 Relay_Log_Pos: 255 Relay_Master_Log_File: mysql-log-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: test 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: 2526733 Relay_Log_Space: 559 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: 1 row in set (0.00 sec) mysql>
注意到 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes,则表示成功复制。否则,可能是连接、用户或数据库初态不一致的问题。
7、建立B到A的复制,完成双向备份
Server B MySQL shell
mysql> show master status; +----------------------+----------+--------------+--------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------------+----------+--------------+--------------------------+ | mysql-log-bin.000001 | 518 | | mysql,information_schema | +----------------------+----------+--------------+--------------------------+ 1 row in set (0.00 sec)
Server A MySQL shell
mysql> slave stop; Query OK, 0 rows affected (0.03 sec) mysql> change master to -> master_host='192.168.0.120', -> master_user='dbrep', -> master_password='123456', -> master_log_file='mysql-log-bin.000001', -> master_log_pos=518; mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.120 Master_User: dbrep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-log-bin.000001 Read_Master_Log_Pos: 518 Relay_Log_File: mysql-relay-log.000226 Relay_Log_Pos: 255 Relay_Master_Log_File: mysql-log-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: test 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: 518 Relay_Log_Space: 559 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: 1 row in set (0.00 sec) mysql>
注:以上在B的数据不会被操作的环境下操作,如有必要,同样得锁定数据库
同样看到 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes,表示成功复制。
注意:在数据库操作时,如果没有 选择数据的操作, 像 use test, 这个操作将不会写入到二进制日志,这样就不会完成复制。像 "insert into test.test values(1,2,3);",这样虽然能写到master数据库,但是在slave不会有任何改变。
参考:
学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践