主从故障恢复(从主数据库备份恢复至从数据库:)
大数据量备份与还原,始终是个难点。当MYSQL超10G,用mysqldump就会显得力不从心。因此选择xtrabackup,这个工具比mysqldump要快很多。
- 如果数据库首次备份,主数据库要全量备份:
$ apt-get install xtrabackup libdbd-mysql-perl //安装工具和依赖 $ mkdir -p /backup/mysql/data //创建备份存放目录 $ innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** /backup/mysql/data //进行备份 $ mysql -u root -p Enter password: mysql> flush tables with read lock; //锁表,防止主数据库更新 mysql> SHOW VARIABLES LIKE 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | ON | +-----------------+-------+ mysql> SET GLOBAL event_scheduler = off ; //关闭事件调度器 1 row in set (0.00 sec) mysql> exit $ cd /backup/mysql/data $ mkdir 2016-08-31_14-00 //为方便管理,创建一个时间戳目录 $ mv * 2016-08-31_14-00/ //将全量备份的内容移动到时间戳目录内 $ tar -czvf 2016-08-31_14-00.tar.gz ./2016-08-31_14-00/ //将全备内容打包方便归档和网络传输
- 从数据库全备恢复操作:
$ mkdir -p /backup/mysql/data //建立相同目录的存放全量备份的目录 $ cd /backup/mysql/data $ scp root@192.168.1.140:/backup/mysql/data/2016-08-31_14-00.tar.gz ./ //将主库全量备份的内容拷贝至从库机 $ tar -xvf 2016-08-31_14-00.tar.gz //解压全备 $ service mysql stop //停止从库 $ mv /var/log/mysql /var/log/mysql_old //清理旧日志 $ mkdir /var/log/mysql $ chown mysql:mysql /var/log/mysql $ rm -rvf /usr/local/mysql/var/* //清除从库内的数据文件 $ innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --use-memory=4G --apply-log /backup/mysql/data/2016-08-31_14-00 //还原恢复第一步apply-log $ innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --copy-back /backup/mysql/data/2016-08-31_14-00 //还原恢复第二步copy-back $ chown -R mysql:mysql /usr/local/mysql/var/* $ service mysql start
- 主从重新配置:
master:$ mysql -u root -p Enter password: mysql> reset master; mysql> GRANT REPLICATION SLAVE ON *.* TO 'dbslave'@'192.168.1.%' IDENTIFIED BY 'yourpassword';
slave:
$ mysql -uroot -p Enter password: mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> reset slave; Query OK, 0 rows affected (0.08 sec) mysql> change master to master_host='192.168.1.140',master_user='dbslave',master_password='yourpassword',master_port=3306,master_auto_position=1; Query OK, 0 rows affected, 2 warnings (0.09 sec) mysql> start slave; Query OK, 0 rows affected, 1 warning (0.03 sec)
- 主库解锁
$ mysql -uroot -p Enter password: mysql> unlock tables; mysql> SHOW VARIABLES LIKE 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | OFF | +-----------------+-------+ mysql> SET GLOBAL event_scheduler = on ; 开启事件调度器
- 主从故障的主库增量备份:
第一次的备份采用全备实现,之后的主从故障如果发生,全备会消耗大量时间,故采用增量备份形式。增量备份需要基于全备,先假设我们已经有了一个全备(/backup/mysql/data/2016-08-31_14-00),在该全备的基础上做增量备份。$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql/data/2016-08-31_14-00 --incremental /backup/mysql/data
其中–incremental-basedir指向全备目录,–incremental指向增量备份的目录。之后过程相同,创建新的时间戳目录,打包,传输。
- 主从故障的从库增量备份恢复:
增量备份的恢复比全备要复杂很多。
第一步是在所有备份目录下重做已提交的日志$ innobackupex --apply-log --redo-only BASE-DIR $ innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 $ innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备 份,以此类推。这里要注意的是:最后一步的增量备份并没有–redo-only选项!还有,可以使用–use_memory提高性能。以上语句执行成 功之后,最终数据在BASE-DIR(即全备目录)下。
第二步:回滚未完成的日志:
$ innobackupex --apply-log BASE-DIR
第三部:拷贝数据库
$ innobackupex --copy-back BASE-DIR
重复赋权过程,至此完成
0 条评论