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[=#]
                1、記錄爲CHANGE MASTER TO語句,此語句不被註釋;
                2、記錄爲註釋的CHANGE MASTER TO語句;
            --flush-logs;
                鎖定表完成後,執行flush logs命令做日誌滾動;

        注意:二進制日誌文件不應該與數據文件放在同一磁盤裏:

備份還原示例

    模擬場景,在週日剛做完完全備份之後,週一早上數據庫服務器崩掉了
    1、正常用MySQLdump做完全備份
        [root@node7 ~]# mysqldump -uroot -p123456 --all-databases --lock-all-tables --master-data=2 > /root/all.sql
    2、正常使用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;

    3、模擬數據庫服務器down機,這裏就把數據庫服務給停掉就行
        [root@node7 ~]#systemctl stop mysqld

    4、找臺已經裝好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)
    5、登錄數據庫查看數據庫是否完整,這裏看到的數據還是週日做的完全備份之前的數據,之後新添加的數據沒有記錄,這時候就需要去之前那臺服務器通過二進制日誌文件把後續新加的給導出來
        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 |
        +-------+---------------+-----+--------+---------+-----------+

    6、把後續新添加的數據從二進制日誌文件裏面導出來然後再導入到新服務器上去,這時候就需要查看之前做完全備份時裏面的內容,從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 [email protected]:/root/
    7、再次把後續新增加的內容導入到數據庫中,查看數據是否完整
        [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的備份

    1、請求鎖定所有表;
    mysql> flush tables with read lock;

    2、記錄二進制日誌文件及事件位置;
    mysql> flush logs;
    mysql> show master status;
    # mysql -e 'show master status' > /root/log.txt

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

    4、釋放鎖
    mysql> unlock tables;

    5、掛載快照卷,執行數據備份;

    6、備份完成後,刪除快照卷;

    7、制定好策略,通過原卷備份二進制日誌,最好滾動二進制日誌

Xtrabackup備份和恢復方式


xtrabackup
    percona公司研發  
    官網:
            www.percona.com

    percona-server

    innodb --> xtradb
        xtrabackup

    備份出來的數據文件,是不能直接拿來去還原的,要還原之前需要把事務日誌應用到數據文件上,提交的事務給它提交,未提交的事務給它做回滾,這數據文件纔算完整。接着這個數據文件才能拿來做還原

    如果說只做一次完全備份,這個備份的結果中除了數據之外還有事務日誌,事務日誌中以提交事務應該都給它同步合併到數據文件中去在還原之前,而未提交事務都應該回滾

xtrabackup完全備份示例:
    1、創建備份目錄
    [root@node7 ~]#mkdir /backups
    [root@node7 ~]#innobackupex --user=root --password=123456 /backups/

    2、備份生成的文件:
    [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

    在另外一臺機器上實現還原,要還原的這臺機器事先不要啓動
    3、還原之前先做整理
    [root@node6 ~]#innobackupex --apply-log /backups/2018-10-15_19-54-48/
    4、把MySQL服務停掉
    [root@node6 ~]#service mysqld stop 
    Stopping mysqld (via systemctl):                           [  OK  ]
    5、還原數據庫
    [root@node6 ~]#rm -rf /data/mysql/*
    [root@node6 ~]#innobackupex --copy-back /backups/2018-10-15_19-54-48
    6、最後修改權限
    [root@node6 /data/mysql]#chown -R mysql.mysql /data/mysql/

增量備份示例:
    1、增量備份前先做完全備份
    [root@node6 ~]#innobackupex --user=root --password=123456 /backups/

    2、做完完全備份之後連接到數據庫裏面新增幾條新數據
    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

    3、做增量備份
    [root@node6 ~]#innobackupex --user=root --password=123456 --incremental /backups/ --incremtal-basedir=/backups/2018-10-15_20-34-39/
    4、查看增量備份目錄下的文件
    [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

    5、開始還原,先整理完全備份
    [root@node6 ~]#innobackupex --apply-log --redo-only /backups/2018-10-15_20-34-39/

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

    7、查看完全備份裏面的信息
    [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

    8、模擬數據庫服務故障,先停止服務、刪除數據文件
    [root@node6 ~]#service mysqld stop 
    [root@node6 ~]#rm -rf /data/mysql/*

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

    10、查看數據庫的數據目錄
    [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

    11、最後修改數據目錄的所屬主和所屬組
    [root@node6 /data/mysql]#chown -R mysql.mysql ./*

    12、啓動數據庫
    [root@node6 /data/mysql]#service mysqld start
    Starting mysqld (via systemctl):                           [  OK  ]

    13、連接服務器查看數據是否完整,之前添加的兩條數據都在
    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/*

    恢復數據
        1、先做整理,確保數據完整
        [root@node6 ~]# xtrabackup --prepare --target-dir=/backups/base
        2、開始還原數據
        [root@node6 ~]# xtrabackup --copy-back --target-dir=/backups/base
        3、修改數據目錄的所屬組
        [root@node6 ~]# chown -R mysql.mysql /data/mysql
        4、啓動數據庫
        [root@node6 ~]# service mysqld start

完全+增量備份、還原示例:
    1、做完全備份
    [root@node6 ~]# xtrabackup --user=root --password=123456 --backup --target-dir=/backups/base

    2、往數據庫裏面插入新數據記錄
    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)

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

    4、第二次往數據庫裏面新增加數據記錄
    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)

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

    6、模擬數據庫崩潰,還是先停止數據庫,後刪除/data/mysql下所有文件
    [root@node6 ~]# service mysqld stop 
    [root@node6 ~]# rm -rf /data/mysql/*

    7、整理備份文件,先從完全備份開始
    [root@node6 ~]# xtrabackup  --prepare --apply-log-only --target-dir=/backups/base

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

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

    10、做完所有整理之後開始還原
    [root@node6 ~]# xtrabackup --copy-back --target-dir=/backups/base

    11、修改數據存放目錄的屬性
    [root@node6 ~]# chown -R mysql.mysql /data/mysql

    12、啓動數據庫,並進入數據庫查看數據是否完整
    [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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章