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)
相關文章
相關標籤/搜索