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/   [email protected]:/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 [email protected]: GRANT REPLICATION SLAVE ON *.* TO 'sharelinux'@'192.168.161.129' IDENTIFIED BY PASSWORD '*84BB5DF4823DA319BBF86C99624479A198E6EEE9'
1 row in set (0.00 sec)

Slave:

# scp [email protected]:/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维护工作变得更加简单化了。