Xtrabackup部署复制环境的优势:一是支持热备,而创建master节点的备份是配置复制环境中最关键的步骤,还有一项优势就是不需要重启master节点(如果不需要修改master节点配置文件的话),但备份时涉及大量的读写,必然还是会对master节点的服务器性能造成影响。只是从操作者的角度来看,对master节点确实是透明的。
1. 在master节点创建完整备份
备份前创建复制账户:
grant replication slave on *.* to 'repl'@'192.168.48.%' identified by 'mysqld'; --仅拥有读取二进制日志的权限
[mysql@mysql ~]# innobackupex --defaults-file=/u01/my3306/my.cnf --user=root --password=mysqld --socket=/u01/my3306/run/mysql.sock --stream=tar /tmp |gzip -> /backup/bak/xtrea_fullbackup.tar.gz
2. 复制备份集到slave节点,准备数据
[mysql@mysql bak]$ scp xtrea_fullbackup.tar.gz mysql@192.168.48.51:/home/mysql/bakforslave
mysql@192.168.48.51's password:
xtrea_fullbackup.tar.gz 100% 1377KB 1.3MB/s 00:00
--解压缩到data目录
[mysql@mysql bak]# tar xivfz xtrea_fullbackup.tar.gz -C /u01/my3306/data
--准备数据
[mysql@mysql_slave bakforslave]$ innobackupex --defaults-file=/u01/my3306/my.cnf --apply-log /u01/my3306/data
注意:默认情况下,innobackupex会把innodb的日志恢复到data目录下,如果直接启动的话mysql会自动根据参数文件中的位置创建iblog和ibdata,就和我们恢复出来的数据不一致,这种情况下,show tables可以看到表,但查询可能会报table not exists的报错。所以恢复完之后需要手工将iblog和ibdata从data目录覆盖到my.cnf指定的iblog路径。
[mysql@mysql_slave data]$ mv ib* /u01/my3306/log/iblog
3. 修改master和slave的serverid为不同值
[mysql@mysql my3306]$ cat my.cnf |grep server_id
server_id=101
[mysql@mysql_slave my3306]$ cat my.cnf |grep server_id
server_id=102
4. 配置slave节点复制环境
Slave节点连接master时,需要指定读取的二进制日志文件和位置,在传统方式创建slave时,通常是手工在master查询这个信息,而后在创建备份集,对于xtrabackup创建的备份集,直接查看xtrabackup_binlog_info这个文件即可。
[mysql@mysql_slave data]$ cat xtrabackup_binlog_info
binlog.000009 120
mysql> change master to
-> master_host='192.168.48.50',
-> master_port=3306,
-> master_user='repl',
-> master_password='mysqld',
-> master_log_file='binlog.000009',
-> master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
另外,innobackup支持—slave-info的参数,指定该参数创建的备份集会包含一个xtrabackup_slave_info的文件,这个文件中直接提供了change master的语句。
5. 启动slave
mysql> start slave;
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.48.50
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000009
Read_Master_Log_Pos: 329
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 489
Relay_Master_Log_File: binlog.000009
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: 329
Relay_Log_Space: 655
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: 101
Master_UUID: a977f04f-f591-11e7-9981-000c29388835
Master_Info_File: /u01/my3306/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
ERROR:
No query specified