Mysql添加从库一般就两种方法,一种是通过mysql自带的mysqldump命令,这种属于逻辑备份,备份和恢复的时间都比较长,而且会锁表,一般应用于数据量比较少的场合。另外一种是第三方开源工具Xtrabackup,这工具属于物理备份,备份和恢复时间都比较快而且不锁表,更多介绍可以到它官网上面参考https://www.percona.com/
实验环境:
Master:192.168.161.128 CentOS release 6.5 (Final) Mysql5.6.14 Slave :192.168.161.129 CentOS release 6.5 (Final) Mysql5.6.14
Master:
# innobackupex --user=root --password=redhat --defaults-file=/usr/local/webserver/mysql5.6/my.cnf --no-timestamp /data/backup/slave ......................................... innobackupex: Backup created in directory '/data/backup/slave' innobackupex: MySQL binlog position: filename 'mysql-bin.000002', position 120 160202 10:40:27 innobackupex: Connection to database server closed 160202 10:40:27 innobackupex: completed OK!
Master:
# innobackupex --user=root --password=redhat --defaults-file=/usr/local/webserver/mysql5.6/my.cnf --apply-log /data/backup/slave #创建快照 .......................................... xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: FTS optimize thread exiting. InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 22347622 160202 10:43:38 innobackupex: completed OK!
Slave:
# service mysqld stop #先关闭数据库 Shutting down MySQL.. [ OK ] # mkdir /usr/local/webserver/mysql5.6/data_bak #创建一个备份原来数据的文件夹 # mv /usr/local/webserver/mysql5.6/data/* /usr/local/webserver/mysql5.6/data_bak/ #将原来的数据迁移到这个备份文件夹上面。
Master:
# rsync -avz /data/backup/slave/ root@192.168.161.129:/usr/local/webserver/mysql5.6/data/ #将备份出来的数据同步到从库数据库的data目录
Slave:
# ll /usr/local/webserver/mysql5.6/data #数据已经同步过来了 total 178228 -rw-r--r--. 1 root root 295 Feb 2 10:40 backup-my.cnf #包含备份所必须的一些初始化参数。 drwx------. 2 root root 4096 Feb 2 10:40 db01 -rw-r-----. 1 root root 79691776 Feb 2 10:43 ibdata1 -rw-r--r--. 1 root root 50331648 Feb 2 10:43 ib_logfile0 -rw-r--r--. 1 root root 50331648 Feb 2 10:43 ib_logfile1 drwx------. 2 root root 4096 Feb 2 10:40 mysql drwxr-xr-x. 2 root root 4096 Feb 2 10:40 performance_schema drwx------. 2 root root 4096 Feb 2 10:40 sharelinux drwxr-xr-x. 2 root root 4096 Feb 2 10:40 test -rw-r--r--. 1 root root 21 Feb 2 10:40 xtrabackup_binlog_info #记录备份时的二进制日志文件的位置。 -rw-r--r--. 1 root root 22 Feb 2 10:43 xtrabackup_binlog_pos_innodb -rw-r-----. 1 root root 91 Feb 2 10:43 xtrabackup_checkpoints #记录LSN以及备份的类型。 -rw-r--r--. 1 root root 638 Feb 2 10:40 xtrabackup_info #记录binlog和pos的位置。 -rw-r-----. 1 root root 2097152 Feb 2 10:43 xtrabackup_logfile #备份日志文件,里面记录备份操作过程中数据库的变更。 drwx------. 2 root root 12288 Feb 2 10:40 zabbix
Slave:
# chown mysql:mysql /usr/local/webserver/mysql5.6/data -R #将权限更改为mysql # service mysqld start Starting MySQL.... [ OK ]
Master:
mysql> grant replication slave on *.* to 'sharelinux'@'192.168.161.129' identified by 'redhat'; #在Master的数据库中建立一个备份帐户 Query OK, 0 rows affected (0.00 sec)
Slave:
# mysql -h192.168.161.128 -usharelinux -predhat #确保在从库可以用这个用户登录到Master端的数据库。 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.14-log Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show grants\G; *************************** 1. row *************************** Grants for sharelinux@192.168.161.129: GRANT REPLICATION SLAVE ON *.* TO 'sharelinux'@'192.168.161.129' IDENTIFIED BY PASSWORD '*84BB5DF4823DA319BBF86C99624479A198E6EEE9' 1 row in set (0.00 sec)
Slave:
# scp root@192.168.161.128:/usr/local/webserver/mysql5.6/my.cnf /usr/local/webserver/mysql5.6/my.cnf #拷贝主库的my.cnf替换从库的my.cnf,并将server_id的值更改为2。 # service mysqld restart Shutting down MySQL.. [ OK ] Starting MySQL... [ OK ]
Slave:
# cat /usr/local/webserver/mysql5.6/data/xtrabackup_binlog_info #记录备份时的二进制日志文件的位置。 mysql-bin.000002 120
Slave:
mysql> change master to -> master_host='192.168.161.128', -> master_user='sharelinux', -> master_password='redhat', -> master_log_file='mysql-bin.000002', -> master_log_pos=120; Query OK, 0 rows affected, 2 warnings (0.19 sec)
mysql> start slave; Query OK, 0 rows affected (0.04 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.161.128 Master_User: sharelinux Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 120 Relay_Log_File: node2-relay-bin.000004 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes #必须为Yes Slave_SQL_Running: Yes #必须为Yes ....................................
到这里通过Xtrabackup在线添加从库就完成了。有了Xtrabackup可以使Mysql维护工作变得更加简单化了。