zoukankan      html  css  js  c++  java
  • innobackupex基于binlog日志的恢复 -- 模拟slave恢复

    说明:
    一般来说,如果恢复的binlog量不大,可以使用此方法来恢复:
    mysqlbinlog /data/mysqlbak/binlogbak/restoredb-bin.000018 |mysql -u root -pchengce243

    但是如果binlog量非常大,使用此方法会非常慢,下面介绍一种方法,让MySQL模拟成slave恢复,速度非常快。

    测试表中数据
    mysql> select * from testdb.testtab;
    +-------+-----------+
    | id | name |
    +-------+-----------+
    | 10000 | test |
    | 10001 | incr_bak |
    | 10002 | incr_bak2 |
    +-------+-----------+

    备份
    先做一次完整备份:

    innobackupex --defaults-file=/etc/my.cnf --user root --password chengce243 /data/mysqlbak

    执行完命令后,/data/mysqlbak 目录下会生成目录: 2018-08-07_15-11-36

    多切换几次 binlog日志
    mysql> flush logs;


    插入测试数据
    insert into testtab values (20001,'full_bak');

    多切换几次 binlog日志
    mysql> flush logs;

    再插入测试数据
    insert into testtab values (20002,'full_bak2');

    多切换几次 binlog日志
    mysql> flush logs;

    [root@restoredb ~]# ll /data/mysql/*bin*
    [root@restoredb mysql]# ll /data/mysql/*bin*
    -rw-r----- 1 mysql mysql 205 Aug 7 15:12 /data/mysql/restoredb-bin.000001
    -rw-r----- 1 mysql mysql 205 Aug 7 15:12 /data/mysql/restoredb-bin.000002
    -rw-r----- 1 mysql mysql 205 Aug 7 15:12 /data/mysql/restoredb-bin.000003
    -rw-r----- 1 mysql mysql 479 Aug 7 15:13 /data/mysql/restoredb-bin.000004
    -rw-r----- 1 mysql mysql 205 Aug 7 15:13 /data/mysql/restoredb-bin.000005
    -rw-r----- 1 mysql mysql 480 Aug 7 15:13 /data/mysql/restoredb-bin.000006
    -rw-r----- 1 mysql mysql 205 Aug 7 15:13 /data/mysql/restoredb-bin.000007
    -rw-r----- 1 mysql mysql 205 Aug 7 15:13 /data/mysql/restoredb-bin.000008
    -rw-r----- 1 mysql mysql 205 Aug 7 15:13 /data/mysql/restoredb-bin.000009
    -rw-r----- 1 mysql mysql 154 Aug 7 15:13 /data/mysql/restoredb-bin.000010
    -rw-r----- 1 mysql mysql 230 Aug 7 15:13 /data/mysql/restoredb-bin.index


    停止MySQL服务

    /etc/init.d/mysqld stop


    备份binlog(正常情况下,这些binlog会备份到binlog server,此处用复制模拟binlog server备份路径)。

    [root@restoredb mysql]# cp *bin* /data/mysqlbak/binlogbak/
    [root@restoredb mysql]# ll /data/mysqlbak/binlogbak
    total 44
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000001
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000002
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000003
    -rw-r----- 1 root root 479 Aug 7 15:14 restoredb-bin.000004
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000005
    -rw-r----- 1 root root 480 Aug 7 15:14 restoredb-bin.000006
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000007
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000008
    -rw-r----- 1 root root 205 Aug 7 15:14 restoredb-bin.000009
    -rw-r----- 1 root root 177 Aug 7 15:14 restoredb-bin.000010
    -rw-r----- 1 root root 230 Aug 7 15:14 restoredb-bin.index


    清空数据文件
    rm -rf /data/mysql/*


    恢复
    直接复制 /data/mysqlbak/2018-08-07_15-11-36 目录下文件到 /data/mysql 目录下,然后修改权限
    cp -r /data/mysqlbak/2018-08-07_15-11-36/* /data/mysql/
    chown -R mysql:mysql /data/mysql

    直接启动数据
    /etc/init.d/mysqld start


    查看 binlog 和pos点
    [root@restoredb mysql]# cat xtrabackup_binlog_info
    restoredb-bin.000001 154

    查看此时的testtab表:
    mysql> select * from testdb.testtab;
    +-------+-----------+
    | id | name |
    +-------+-----------+
    | 10000 | test |
    | 10001 | incr_bak |
    | 10002 | incr_bak2 |
    +-------+-----------+


    测试数据 (20001,'full_bak')并不存在,说明binlog日志的数据并没有恢复


    开始使用模拟slave的方式恢复binlog日志
    1.随意change一个不存在的地址,格式和正常的一样。
    change master to master_host='1',master_user='1',master_password='1',master_port=1,master_log_file='1',master_log_pos=1;

    2.关闭 MySQL。
    /etc/init.d/mysqld stop

    3.把binlog rename成relaylog的名字。
    cd /data/mysqlbak/binlogbak/
    rename "bin" "relay-bin" *

    4.把binlog移到定义的relaylog目录,如果存在对应文件,直接覆盖,并修改权限。
    cp /data/mysqlbak/binlogbak/* /data/mysql/
    chown mysql:mysql /data/mysql/restoredb-relay-bin.*

    5.把rename后的binlog的绝对路径全部写到 restoredb-relay-bin.index文件,一行写一个。
    /data/mysql/restoredb-relay-bin.000001
    /data/mysql/restoredb-relay-bin.000002
    /data/mysql/restoredb-relay-bin.000003
    /data/mysql/restoredb-relay-bin.000004
    /data/mysql/restoredb-relay-bin.000005
    /data/mysql/restoredb-relay-bin.000006
    /data/mysql/restoredb-relay-bin.000007
    /data/mysql/restoredb-relay-bin.000008
    /data/mysql/restoredb-relay-bin.000009
    /data/mysql/restoredb-relay-bin.000010


    6.修改 relay-log.info 里面配置,修改第二行和第三行,第二行修改为index文件里面的第一行,第三行指定POS点。


    7.启动 MySQL。
    /etc/init.d/mysqld start

    8.启动 sql_thread进程。
    start slave sql_thread;


    查看数据
    mysql> select * from testdb.testtab;
    +-------+-----------+
    | id | name |
    +-------+-----------+
    | 10000 | test |
    | 10001 | incr_bak |
    | 10002 | incr_bak2 |
    | 20001 | full_bak |
    | 20002 | full_bak2 |
    +-------+-----------+
    6 rows in set (0.01 sec)

    发现已经是最新的数据,已经恢复过来。

  • 相关阅读:
    Mysql 表分区
    Java json串生成及转bean
    ZK 样式使用
    ZK 使用jfreeChart
    Struct2 csv文件上传读取中文内容乱码
    Mysql 学习笔记
    java 调用C#webservice
    ace 后台管理模板可取之处
    Linux常用命令大全
    将图片转成base64写进hml,无需依赖本地文件
  • 原文地址:https://www.cnblogs.com/liang545621/p/9432024.html
Copyright © 2011-2022 走看看