主从故障恢复(从主数据库备份恢复至从数据库:)


大数据量备份与还原,始终是个难点。当MYSQL超10G,用mysqldump就会显得力不从心。因此选择xtrabackup,这个工具比mysqldump要快很多。

  1. 如果数据库首次备份,主数据库要全量备份:
    $ 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/            //将全备内容打包方便归档和网络传输                
    
  2. 从数据库全备恢复操作:
    $ 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
  3. 主从重新配置:
    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)
  4. 主库解锁
    $ 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 ; 开启事件调度器
    
  5. 主从故障的主库增量备份:
    第一次的备份采用全备实现,之后的主从故障如果发生,全备会消耗大量时间,故采用增量备份形式。增量备份需要基于全备,先假设我们已经有了一个全备(/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指向增量备份的目录。之后过程相同,创建新的时间戳目录,打包,传输。

  6. 主从故障的从库增量备份恢复:
    增量备份的恢复比全备要复杂很多。
    第一步是在所有备份目录下重做已提交的日志

    $ 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 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注