MySQL-备份和恢复实战

逻辑备份工具

逻辑备份三种工具:
    MySQLdump
    mydumper
    PHPmyadmin

        schema和数据存储在一块儿、巨大的SQL语句、单个巨大的备份文件;

        MySQLdump:客户端命令,经过MySQL协议链接至mysqld服务器;
            mysqldump [options] [db_name [tbl_name ...]]

                备份的数据集:
                    -A,--all-databases
                    -B db_name,....
                        --databases db_name,...
            shell> mysqldump [options] db_name [tbl_name ...]
            shell> mysqldump [options] --databases db_name ...
            shell> mysqldump [options] --all-databases

        备份单个数据库
          [root@node7 /data/mysql]#mysqldump -uroot -p123456 --databases hellodb > hellodb.sql
        备份两个数据库:
        [root@node7 /data/mysql]#mysqldump -uroot -p123456 --databases hellodb mysql > /root/hellodb_mysql.sql

        MyISAM:支持锁定备份库,然后启动备份操做:
            锁定方法:
                --lock-all-tables:锁定全部库的全部表;
                --lock-tables:对于每一个单独的数据库,在启动备份以前锁定其全部表;
            对innodb表同样生效,实现温备;
        innodb;支持热备;
            --single-transaction
        其它选项:
            -E:--events:备份指定数据库相关的全部event scheduler
            -R:--routines;备份指定数据库相关的全部存储过程和存储函数;
            --triggers:备份表相关的触发器;
            --master-data[=#]
                一、记录为CHANGE MASTER TO语句,此语句不被注释;
                二、记录为注释的CHANGE MASTER TO语句;
            --flush-logs;
                锁定表完成后,执行flush logs命令作日志滚动;

        注意:二进制日志文件不该该与数据文件放在同一磁盘里:

备份还原示例

模拟场景,在周日刚作完彻底备份以后,周一早上数据库服务器崩掉了
    一、正经常使用MySQLdump作彻底备份
        [root@node7 ~]# mysqldump -uroot -p123456 --all-databases --lock-all-tables --master-data=2 > /root/all.sql
    二、正常使用SQL语句插入数据
        MariaDB [hellodb]> insert into students (name,age,gender,classid,teacherid)values('li',43,'M',3,7);
        MariaDB [hellodb]> delete from students where stuid=3;

    三、模拟数据库服务器down机,这里就把数据库服务给停掉就行
        [root@node7 ~]#systemctl stop mysqld

    四、找台已经装好MySQL数据库备用服务器,而后把以前备份的数据库拷贝到这台备用机上作还原,建议把二进制日志临时关闭,这里修改的是会话级别的,关闭以后不要退出当前会话,导入完以后把二进制开启(注意;数据库的版本最好要一致,不然导入数据时会报各类错误)
        MariaDB [hellodb]> set sql_log_bin=off;
        Query OK, 0 rows affected (0.00 sec)
        MariaDB [hellodb]> source /root/all.sql;
        MariaDB [hellodb]> set sql_log_bin=on;
        Query OK, 0 rows affected (0.00 sec)
    五、登陆数据库查看数据库是否完整,这里看到的数据仍是周日作的彻底备份以前的数据,以后新添加的数据没有记录,这时候就须要去以前那台服务器经过二进制日志文件把后续新加的给导出来
        MariaDB [hellodb]> select * from students;
        +-------+---------------+-----+--------+---------+-----------+
        | StuID | Name          | Age | Gender | ClassID | TeacherID |
        +-------+---------------+-----+--------+---------+-----------+
        |     2 | Shi Potian    |  22 | M      |       1 |         7 |
        |     4 | Ding Dian     |  32 | M      |       4 |         4 |
        |     5 | Yu Yutong     |  26 | M      |       3 |         1 |
        |     6 | Shi Qing      |  46 | M      |       5 |      NULL |
        |     7 | Xi Ren        |  19 | F      |       3 |      NULL |
        |     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
        |     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
        |    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
        |    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
        |    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
        |    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
        |    14 | Lu Wushuang   |  21 | F      |       3 |      NULL |
        |    15 | Duan Yu       |  19 | M      |       4 |      NULL |
        |    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
        |    17 | Lin Chong     |  25 | M      |       4 |      NULL |
        |    18 | Hua Rong      |  23 | M      |       7 |      NULL |
        |    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
        |    20 | Diao Chan     |  19 | F      |       7 |      NULL |
        |    21 | Huang Yueying |  22 | F      |       6 |      NULL |
        |    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
        |    23 | Ma Chao       |  23 | M      |       4 |      NULL |
        |    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
        |    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
        +-------+---------------+-----+--------+---------+-----------+

    六、把后续新添加的数据从二进制日志文件里面导出来而后再导入到新服务器上去,这时候就须要查看以前作彻底备份时里面的内容,从CHANGE MASTER TO MASTER_LOG_FILE=看出最后更新到这个点上后续咱们只须要从这个时间点日后的全部内容导出便可,再传给新服务器作导入。
        [root@node6 ~]#less all.sql 
        -- MySQL dump 10.16  Distrib 10.2.15-MariaDB, for Linux (x86_64)
        --
        -- Host: localhost    Database: 
        -- ------------------------------------------------------
        -- Server version       10.2.15-MariaDB-log
        -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=604;
        [root@node7 ~]#mysqlbinlog --start-position=604 mysql-bin.000002 > /root/incre.sql
        [root@node6 ~]#scp incre.sql root@192.168.137.56:/root/
    七、再次把后续新增长的内容导入到数据库中,查看数据是否完整
        [root@node6 ~]#mysql -uroot -p123456 < incre.sql 
        [root@node6 ~]#mysql -uroot -p123456

        MariaDB [hellodb]> select * from students;
        +-------+---------------+-----+--------+---------+-----------+
        | StuID | Name          | Age | Gender | ClassID | TeacherID |
        +-------+---------------+-----+--------+---------+-----------+
        |     2 | Shi Potian    |  22 | M      |       1 |         7 |
        |     4 | Ding Dian     |  32 | M      |       4 |         4 |
        |     5 | Yu Yutong     |  26 | M      |       3 |         1 |
        |     6 | Shi Qing      |  46 | M      |       5 |      NULL |
        |     7 | Xi Ren        |  19 | F      |       3 |      NULL |
        |     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
        |     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
        |    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
        |    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
        |    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
        |    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
        |    14 | Lu Wushuang   |  21 | F      |       3 |      NULL |
        |    15 | Duan Yu       |  19 | M      |       4 |      NULL |
        |    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
        |    17 | Lin Chong     |  25 | M      |       4 |      NULL |
        |    18 | Hua Rong      |  23 | M      |       7 |      NULL |
        |    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
        |    20 | Diao Chan     |  19 | F      |       7 |      NULL |
        |    21 | Huang Yueying |  22 | F      |       6 |      NULL |
        |    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
        |    23 | Ma Chao       |  23 | M      |       4 |      NULL |
        |    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
        |    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
        |    28 | li            |  43 | M      |       3 |         7 |
        +-------+---------------+-----+--------+---------+-----------+

基于lvm2的备份

一、请求锁定全部表;
    mysql> flush tables with read lock;

    二、记录二进制日志文件及事件位置;
    mysql> flush logs;
    mysql> show master status;
    # mysql -e 'show master status' > /root/log.txt

    三、建立快照:
    lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME

    四、释放锁
    mysql> unlock tables;

    五、挂载快照卷,执行数据备份;

    六、备份完成后,删除快照卷;

    七、制定好策略,经过原卷备份二进制日志,最好滚动二进制日志

Xtrabackup备份和恢复方式

xtrabackup
    percona公司研发  
    官网:
            www.percona.com

    percona-server

    innodb --> xtradb
        xtrabackup

    备份出来的数据文件,是不能直接拿来去还原的,要还原以前须要把事务日志应用到数据文件上,提交的事务给它提交,未提交的事务给它作回滚,这数据文件才算完整。接着这个数据文件才能拿来作还原

    若是说只作一次彻底备份,这个备份的结果中除了数据以外还有事务日志,事务日志中以提交事务应该都给它同步合并到数据文件中去在还原以前,而未提交事务都应该回滚

xtrabackup彻底备份示例:
    一、建立备份目录
    [root@node7 ~]#mkdir /backups
    [root@node7 ~]#innobackupex --user=root --password=123456 /backups/

    二、备份生成的文件:
    [root@node7 ~]#ls /backups/2018-10-15_19-54-48/
    backup-my.cnf   ibdata1             test                    xtrabackup_info
    hellodb         mysql               xtrabackup_binlog_info  xtrabackup_logfile
    ib_buffer_pool  performance_schema  xtrabackup_checkpoints

    在另一台机器上实现还原,要还原的这台机器事先不要启动
    三、还原以前先作整理
    [root@node6 ~]#innobackupex --apply-log /backups/2018-10-15_19-54-48/
    四、把MySQL服务停掉
    [root@node6 ~]#service mysqld stop 
    Stopping mysqld (via systemctl):                           [  OK  ]
    五、还原数据库
    [root@node6 ~]#rm -rf /data/mysql/*
    [root@node6 ~]#innobackupex --copy-back /backups/2018-10-15_19-54-48
    六、最后修改权限
    [root@node6 /data/mysql]#chown -R mysql.mysql /data/mysql/

增量备份示例:
    一、增量备份前先作彻底备份
    [root@node6 ~]#innobackupex --user=root --password=123456 /backups/

    二、作完彻底备份以后链接到数据库里面新增几条新数据
    MariaDB [hellodb]> insert into teachers values (6,'b',32,'F'),(7,'c',40,'M');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0

    三、作增量备份
    [root@node6 ~]#innobackupex --user=root --password=123456 --incremental /backups/ --incremtal-basedir=/backups/2018-10-15_20-34-39/
    四、查看增量备份目录下的文件
    [root@node6 /backups/2018-10-15_20-41-47]#cat xtrabackup_checkpoints 
    backup_type = incremental
    from_lsn = 33003889
    to_lsn = 33006670
    last_lsn = 33006679
    compact = 0
    recover_binlog_info = 0

    五、开始还原,先整理彻底备份
    [root@node6 ~]#innobackupex --apply-log --redo-only /backups/2018-10-15_20-34-39/

    六、接着整理增量备份
    [root@node6 ~]#innobackupex --apply-log --redo-only /backups/2018-10-15_20-34-39/ --incrementadir=/backups/2018-10-15_20-41-47/

    七、查看彻底备份里面的信息
    [root@node6 ~]#less /backups/2018-10-15_20-34-39/xtrabackup_checkpoints 
    backup_type = log-applied
    from_lsn = 0
    to_lsn = 33006670
    last_lsn = 33006679
    compact = 0
    recover_binlog_info = 0

    八、模拟数据库服务故障,先中止服务、删除数据文件
    [root@node6 ~]#service mysqld stop 
    [root@node6 ~]#rm -rf /data/mysql/*

    九、开始还原
    [root@node6 /data/mysql]#innobackupex --user=root --password=123456 --copy-back /backups/28-10-15_20-34-39/

    十、查看数据库的数据目录
    [root@node6 /data/mysql]#ll -h 
    total 77M
    drwxr-x--- 2 root root  272 Oct 15 20:53 hellodb
    -rw-r----- 1 root root 4.3K Oct 15 20:53 ib_buffer_pool
    -rw-r----- 1 root root  76M Oct 15 20:53 ibdata1
    drwxr-x--- 2 root root 4.0K Oct 15 20:53 mysql
    drwxr-x--- 2 root root   20 Oct 15 20:53 performance_schema
    drwxr-x--- 2 root root  102 Oct 15 20:53 test
    -rw-r----- 1 root root   36 Oct 15 20:53 xtrabackup_binlog_pos_innodb
    -rw-r----- 1 root root  584 Oct 15 20:53 xtrabackup_info
    -rw-r----- 1 root root    1 Oct 15 20:53 xtrabackup_master_key_id

    十一、最后修改数据目录的所属主和所属组
    [root@node6 /data/mysql]#chown -R mysql.mysql ./*

    十二、启动数据库
    [root@node6 /data/mysql]#service mysqld start
    Starting mysqld (via systemctl):                           [  OK  ]

    1三、链接服务器查看数据是否完整,以前添加的两条数据都在
    MariaDB [hellodb]> select * from teachers;
    +-----+---------------+-----+--------+
    | TID | Name          | Age | Gender |
    +-----+---------------+-----+--------+
    |   1 | Song Jiang    |  45 | M      |
    |   2 | Zhang Sanfeng |  94 | M      |
    |   3 | Miejue Shitai |  77 | F      |
    |   4 | Lin Chaoying  |  93 | F      |
    |   5 | a             |  34 | M      |
    |   6 | b             |  32 | F      |
    |   7 | c             |  40 | M      |
    +-----+---------------+-----+--------+

新版xtrabackup用法,旧用法也支持

彻底备份、还原示例:
    新版的话须要手动建立备份目录不会像旧版同样自动生成带时间目录,
        [root@node6 ~]# mkdir -p /backups/{base,incre}
        [root@node6 ~]# xtrabackup --user=root --password=123456 --backup --target-dir=/backups/base

    模拟数据库故障,中止数据库,及删除数据文件
        [root@node6 ~]#service mysqld stop
        [root@node6 ~]#rm -rf /data/mysql/*

    恢复数据
        一、先作整理,确保数据完整
        [root@node6 ~]# xtrabackup --prepare --target-dir=/backups/base
        二、开始还原数据
        [root@node6 ~]# xtrabackup --copy-back --target-dir=/backups/base
        三、修改数据目录的所属组
        [root@node6 ~]# chown -R mysql.mysql /data/mysql
        四、启动数据库
        [root@node6 ~]# service mysqld start

彻底+增量备份、还原示例:
    一、作彻底备份
    [root@node6 ~]# xtrabackup --user=root --password=123456 --backup --target-dir=/backups/base

    二、往数据库里面插入新数据记录
    MariaDB [(none)]> use hellodb
    MariaDB [hellodb]> select * from teachers;
    +-----+---------------+-----+--------+
    | TID | Name          | Age | Gender |
    +-----+---------------+-----+--------+
    |   1 | Song Jiang    |  45 | M      |
    |   2 | Zhang Sanfeng |  94 | M      |
    |   3 | Miejue Shitai |  77 | F      |
    |   4 | Lin Chaoying  |  93 | F      |
    +-----+---------------+-----+--------+
    4 rows in set (0.00 sec)
    MariaDB [hellodb]> insert into teachers values (5,'cobbler',28,'M');
    MariaDB [hellodb]> select *  from teachers;
    +-----+---------------+-----+--------+
    | TID | Name          | Age | Gender |
    +-----+---------------+-----+--------+
    |   1 | Song Jiang    |  45 | M      |
    |   2 | Zhang Sanfeng |  94 | M      |
    |   3 | Miejue Shitai |  77 | F      |
    |   4 | Lin Chaoying  |  93 | F      |
    |   5 | cobbler       |  28 | M      |
    +-----+---------------+-----+--------+
    5 rows in set (0.00 sec)

    三、第一次增量备份
    xtrabackup --user=root --password=123456 --backup --target-dir=/backups/incre1 --incremental-basedir=/backups/base

    四、第二次往数据库里面新增长数据记录
    MariaDB [(none)]> use hellodb
    Database changed
    MariaDB [hellodb]> select * from teachers;
    +-----+---------------+-----+--------+
    | TID | Name          | Age | Gender |
    +-----+---------------+-----+--------+
    |   1 | Song Jiang    |  45 | M      |
    |   2 | Zhang Sanfeng |  94 | M      |
    |   3 | Miejue Shitai |  77 | F      |
    |   4 | Lin Chaoying  |  93 | F      |
    |   5 | cobbler       |  28 | M      |
    +-----+---------------+-----+--------+
    5 rows in set (0.00 sec)

    MariaDB [hellodb]> insert into teachers values (6,'wang',23,'M'),(7,'mage',32,'M');
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0

    MariaDB [hellodb]> select * from  teachers;
    +-----+---------------+-----+--------+
    | TID | Name          | Age | Gender |
    +-----+---------------+-----+--------+
    |   1 | Song Jiang    |  45 | M      |
    |   2 | Zhang Sanfeng |  94 | M      |
    |   3 | Miejue Shitai |  77 | F      |
    |   4 | Lin Chaoying  |  93 | F      |
    |   5 | cobbler       |  28 | M      |
    |   6 | wang          |  23 | M      |
    |   7 | mage          |  32 | M      |
    +-----+---------------+-----+--------+
    7 rows in set (0.00 sec)

    五、第二次增量备份
    xtrabackup --user=root --password=123456 --backup --target-dir=/backups/incre1 --incremental-basedir=/backups/incre2 

    六、模拟数据库崩溃,仍是先中止数据库,后删除/data/mysql下全部文件
    [root@node6 ~]# service mysqld stop 
    [root@node6 ~]# rm -rf /data/mysql/*

    七、整理备份文件,先从彻底备份开始
    [root@node6 ~]# xtrabackup  --prepare --apply-log-only --target-dir=/backups/base

    八、整理第一次增量备份文件
    [root@node6 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/incre1

    九、整理第二次增量备份文件,也是最后一次,此次不须要加--apply-log-only
    [root@node6 ~]# xtrabackup --prepare --target-dir=/backups/base --incremental-dir=/backups/incre2

    十、作完全部整理以后开始还原
    [root@node6 ~]# xtrabackup --copy-back --target-dir=/backups/base

    十一、修改数据存放目录的属性
    [root@node6 ~]# chown -R mysql.mysql /data/mysql

    十二、启动数据库,并进入数据库查看数据是否完整
    [root@node6 ~]# service mysqld start
    [root@node6 ~]# mysql -uroot -p123456
    MariaDB [(none)]> use hellodb
    Database changed
    MariaDB [hellodb]> select * from teachers;
    +-----+---------------+-----+--------+
    | TID | Name          | Age | Gender |
    +-----+---------------+-----+--------+
    |   1 | Song Jiang    |  45 | M      |
    |   2 | Zhang Sanfeng |  94 | M      |
    |   3 | Miejue Shitai |  77 | F      |
    |   4 | Lin Chaoying  |  93 | F      |
    |   5 | cobbler       |  28 | M      |
    |   6 | wang          |  23 | M      |
    |   7 | mage          |  32 | M      |
    +-----+---------------+-----+--------+
    7 rows in set (0.00 sec)
相关文章
相关标签/搜索