数据库备份和恢复是数据库管理工作中非常重要的一个部分。
笔者常用的两个备份工具是mysqldump (逻辑备份)和 Xtrabackup (物理备份)。
对于前者一般是用在凌晨的业务低峰期的定时任务中对数据库进行全备份;这样做的好处是导出的数据是全SQL 文本,通过管道GZIP 压缩后能够大大的节省磁盘空间(当然备份一般会上传异地服务器存储)。mysqldumpd 缺点是比较耗费时间,笔者建议数据量在50GB以内的可以使用该工具,耗时尚可接受;但是数据量超过70GB时,不建议使用该工具。
对于后者使用不太频繁,该工具也可以生成一致性备份,用于搭建主从环境。针对数据量较大的(100GB以上,甚至数百GB)数据库,备份时间上Xtrabackup的优势非常明显,并且不会影响线上业务。
下面以搭建主从环境为例,简单介绍 下 Xtrabackup 的安装和使用。演示版本为 percona-xtrabackup-2.1.9 ,支持 MySQL 5.5 5.6。
1.安装依赖软件包
yum -y install perl perl-devel libaio libaio-devel perl-DBI perl-DBD-MySQL perl-TermReadKey perl-Time-HiRes
2.安装xtrabackup
解压tar包到安装目录,
tar -zxvf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz -C /usr/local/
重命名目录
cd /usr/local/
mv percona-xtrabackup-2.1.9-744-Linux-x86_64 xtrabackup
3.执行备份之前,先配置环境变量,否则报错
export PATH=$PATH:/usr/local/xtrabackup/bin
其中配置文件的路径和密码请根据自己的实际环境设置
备份数据文件
/usr/local/xtrabackup/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=A2sW13 /ptbak/
将binlog 应用到数据文件,这是恢复数据前必须完成的步骤
/usr/local/xtrabackup/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=A2sW13 --apply-log /ptbak/2016-08-09_03-49-02/
拷贝备份数据到目标数据库
scp -r /ptbak/ 192.168.80.12:/root/
3.恢复数据钱准备工作
先在目标库上停掉mysql进程
service mysqld stop
备份或者删原数据目录 (以 /usr/local/mysql/data 为示例)
mv /usr/local/mysql/data/ /usr/local/mysql/data.bak/
或者 rm -rf /usr/local/mysql/data
(删除数据之前请三思,线上环境不建议这么干)
建立新的数据目录
mkdir -p /usr/local/mysql/data
4.恢复数据,--copy-back 选项的作用是从备份目录拷贝数据,日志到my.cnf文件里规定的目录下
/usr/local/xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /root/2016-08-09_03-49-02/
修改数据目录权限
chown -R mysql:mysql /usr/local/mysql/data
5.删除ib_logfile文件,否则mysql启动报错
cd /usr/local/mysql/data
rm -rf ib_logfile*
启动mysql
service mysql start
6.目标数据库启动后,将拥有和源数据库相同的root密码;建议修改root密码
SET PASSWORD FOR ‘root‘@‘localhost‘ = PASSWORD(‘xxxxxx‘);
7.查看备份的一致性信息
cat /root/2016-08-09_03-49-02/xtrabackup_binlog_info
mysql-bin.000969 307486338
master_log_file=‘mysql-bin.000969‘,
master_log_pos=307486338;
8.设置启用主从复制
主库上建立复制用户和权限
GRANT REPLICATION SLAVE ON *.* TO ‘repl‘@‘192.168.80.12‘ identified by ‘123456‘;
在从库上启动复制进程
change master to
master_host=‘192.168.80.11‘,
master_port=3306,
master_user=‘rpel‘,
master_password=‘123456‘,
master_log_file=‘mysql-bin.000969‘,
master_log_pos=307486338;
>start slave;
不妥之处,敬请指教!