一、全量备份
1.安装xtrabackup
# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
# yum install perl-Digest-MD5 libev -y
# yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
2. 创建备份用户:
mysql> CREATE USER 'backup'@'172.27.%' IDENTIFIED BY 'backup123'; mysql> GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS, SUPER ON *.* TO 'backup'@'172.27.%'; mysql> FLUSH PRIVILEGES;
3. 创建备份目录
# mkdir /data/innobackup
4. 备份
# innobackupex --user=backup --password=backup_123 --port=3306 --socket=/tmp/mysql.sock --defaults-file=/etc/my.cnf --parallel=8 --no-timestamp /data/innobackup
注意:输出的日志‘completed OK!’,说明备份成功
-u, --user: 用户名
-p, --password: 密码
-H, --host: 主机
-P, --port: 端口
-S, --socket: socket
--defaults-file: 指定数据库配置文件
--parallel: 多线程拷贝.ibd文件
--no-timestamp: 不使用时间戳生成备份目录
innobackup主要参数说明:
--defaults-file:指定my.cnf参数文件的位置[此配置文件里必须指定datadir]
--apply-log:应用备份目录中的 xtrabackup_logfile 事务日志文件。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍出于不一致状态。--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--remote-host=HOSTNAME:通过ssh将备份数据存储到进程服务器上
--stream=[tar]:备份文件输出格式, 该文件可在XtarBackup binary文件中获得.在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话,xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题.
--tmpdir=DIRECTORY:当有指定--remote-host or --stream时, 事务日志临时存储的目录,默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only 在“准备全量备份” 和 “合并增量备份(除了最后一个增备)”时使用此选项。它直接传递给xtrabackup的xtrabackup --apply-log-only 选项,使xtrabackup跳过"rollback"阶段,只做"redo"操作。如果后面还有增量备份应用到这个全备,这是必要的
--use-memory=*:该参数在prepare的时候使用,控制prepare时innodb实例使用的内存
--databases=LIST:列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份
--slave-info:备份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件,这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET:指定mysql.sock所在位置,以便备份进程登录mysql
二、恢复
1. apply log
# innobackupex --apply-log /data/innobackup/ --use-memory=16G
注意:留意输出的日志‘completed OK!’,说明apply redo 日志成功.
2. 恢复步骤
# 先停止mysql /etc/init.d/mysqld stop # 清空mysql的data目录,否则会报错:Original data directory /data is not empty! mv /usr/local/mysql/data /usr/local/mysql/data_bak mkdir /usr/local/mysql/data
innobackupex --apply-log /data/innobackup/ --use-memory=16G
拷贝主配置文件my.cnf,并修改server-id等。
# 执行恢复操作 innobackupex --defaults-file=/etc/my.cnf --copy-back /data/innobackup # 授权 chown -R mysql:mysql /usr/local/mysql/data # 物理备份会将主从配置信息一起同步过来。在mysql配置里面添加一行 vim /etc/my.cnf [mysqld] skip-slave-start #添加这一行,slave复制进程不随mysql启动 # 启动数据库 /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & (/etc/init.d/mysqld start)
流式备份:
如果需要将 机器上面的备份数据发送到远程机器,或者快速搭建主从,可以采用流式备份。
例如:这里将172.26.1.3的数据发送到 172.26.1.245 并做成主从同步。 master: 172.26.1.3 slave:172.26.1.245
# 172.26.1.3 备份之前需要先关闭多线程复制,否则会报错
> show variables like '%worker%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | slave_parallel_workers | 0 | +------------------------+-------+ > set global slave_parallel_workers=0;
备份命令:
innobackupex --defaults-file=/etc/my.cnf --user=backup --password="backup123" --port=3306 --socket=/tmp/mysql.sock --slave-info --parallel=16 --stream=xbstream ./ 2>/data/xtrabackup_log.txt | pv -q -L40m | ssh lily@172.26.1.245 " cat - | xbstream -x -C /data/innobackup"
注:这里的 172.26.1.245 是远程机器的ip
--slave-info: 备份目录下会多生成一个xtrabackup_slave_info文件,文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0。
这个参数适用的场景:假设有主库A和从库B,目前想再添加一台备库C,并让备库C以主库A为master;因为主库A是生产库,压力一般比较大,所以就在备库B上备份一个数据库,然后把这个备份拿到C服务器上,并导入到C库,接下来再在C服务器上执行change master的命令:其中master_host是A的ip,而master_log_file和master_log_pos就是这个xtrabackup_slave_info里面的值。
恢复(在远程机器172.26.1.245执行)
1,拷贝master机器的/etc/my.cnf 文件,并修改server_id。
2,执行(二、恢复)这个步骤之后
3,将172.26.1.245做成172.26.1.3的从库, 从 /data/innobackup/xtrabackup_binlog_info 文件里面读取binlog和position信息。
# cat /data/innobackup/xtrabackup_binlog_info
mysql-bin.000066 94839444
mysql> CHANGE MASTER TO MASTER_HOST=
'172.26.1.3'
,MASTER_USER=
'repl'
,MASTER_PASSWORD=
'xxxxxx'
,MASTER_AUTO_POSITION=
0
,MASTER_LOG_FILE=
'mysql-bin.000066'
,MASTER_LOG_POS=94839444
;
mysql> start slave;