使用mysqldump進行MariaDB 的備份

來源:互聯網
上載者:User

使用mysqldump進行MariaDB 的備份

mysqldump備份介紹
mysqldump是mysql用於轉儲存資料庫的公用程式。它主要產生一個SQL指令碼,其中包含從頭重新建立資料庫所必需的命令CREATE TABLE INSERT等,適用於備份資料量不大的資料庫。
優點:備份簡單,恢複容易。
備份缺點:schema和資料存放區在一起,巨大的SQL語句、單個巨大的備份檔案(備份的庫和表都在一個檔案中)。

mysqldump: 是一個mysql用戶端命令,通過mysql協議串連至mysqld,實現Database Backup
命令的文法格式:
  mysqldump [OPTIONS] database [tables]:備份單個庫,或庫指定的一個或多個表
mysqldump[OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]:備份一個或多個庫
mysqldump[OPTIONS] --all-databases [OPTIONS]:備份所有庫
常用選項:
    -A,--all-databases      #備份所有資料庫
    InnoDB:
        --single-transaction:啟動一個大的單一事務實現備份
    -B,--databases db_name1 db_name2 ...:備份指定的資料庫
    -C,--compress:壓縮傳輸;
    -x, --lock-all-tables:鎖定所有表
    -l, --lock-tables:鎖定備份的表

    --flush-logs,-F:鎖定表之後執行flush logs命令;
其它選項:
    -E,--events:備份指定庫的事件調度器;
    -R,--routines:備份預存程序和儲存函數;
    --triggers:備份觸發器
 
    --master-data[=#]:
        1:記錄CHANGE MASTER TO語句;此語句未被注釋;
        2:記錄為備註陳述式;

特別說明:Mariadb的資料恢複嚴重依賴與bin-log日誌,所以為了防止磁碟故障導致資料檔案和bin-log檔案一起丟失,所以最好將bin-log日誌存放到共用儲存中。
設定方法:修改Mariadb設定檔,將記錄檔存放位置指向本地掛載網路儲存的路徑,然後重啟Mariadb服務即可。
[root@MariaDB ~]# vim /etc/my.cnf
log-bin="/backup/bin-log/mysql-bin.x"

驗證:重啟服務之後/backup/bin-log/目錄下就有了Mysql的二進位記錄檔和日誌索引檔案。
[root@MariaDB ~]# ll /backup/bin-log/mysql-bin.*
-rw-rw---- 1 mysql mysql 245 Jun 16 00:00/backup/bin-log/mysql-bin.000001
-rw-rw---- 1 mysql mysql  33 Jun 16 00:00/backup/bin-log/mysql-bin.index

單個庫實現備份恢複
資料庫中有hellodb表一個,需要做對hellodb表的備份,以實現資料庫故障或者發生誤刪除操作時可以及時恢複資料庫。
備份方案為:每周日完全備份一次資料庫,周一到周六增量備份資料庫
備份過程如下
第一天備份:完全備份hellodb資料庫,並且在完全備份的時候鎖定表和滾動二進位日誌
[root@MariaDB~]# mysqldump -B hellodb -u root -p --lock-all-tables --flush-logs  --master-data=2 > /backup/hellodb-`date+%F`.sql
Enterpassword: 
[root@MariaDB~]# ll /backup/
total8
-rw-r--r--1 root root 7950 Jun 16 11:59 hellodb-2015-06-16.sql

由於在做完全備份的時候滾動了二進位日誌,所以在做一些關於資料庫更改的操作都會記錄到新的二進位日誌中,從查看中得知後續日誌會記錄到mysql-bin.000002中。
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |      288 |
| mysql-bin.000002 |      245 |
+------------------+-----------+
2 rows in set (0.00 sec)

備份完成之後的一天時間裡,建立了一張表,並且向表中插入了一些資料
MariaDB[(none)]> use hellodb;
MariaDB[hellodb]> create table tb1 (id int);
MariaDB[hellodb]> insert into tb1 values (1),(2),(3);
MariaDB[hellodb]> select * from tb1;
+------+
|id  |
+------+
|    1 |
|    2 |
|    3 |
+------+

第一天增量備份:當天的所有對資料庫變更的語句都會記錄到二進位記錄檔中,只需要滾動二進位日誌,把二進位日誌進行備份即可,二進位滾動之後,第二天的所有對資料庫變更的語句,都會記錄到新的二進位記錄檔中。
MariaDB[hellodb]> flush logs;
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |      288 |
| mysql-bin.000002 |      577 |
| mysql-bin.000003 |      245 |
+------------------+-----------+
3 rows in set (0.00 sec)

將二進位記錄檔轉換為sql檔案
[root@MariaDB ~]# mysqlbinlog/backup/bin-log/mysql-bin.000002 > /backup/1.sql

第二天操作:繼續向tb1中插入資料
MariaDB[hellodb]> insert into tb1 values (21),(22),(23);
MariaDB[hellodb]> select * from tb1;
+------+
|id  |
+------+
|    1 |
|    2 |
|    3 |
|  21 |
|  22 |
|  23 |
+------+

故障類比
hellodb資料庫遭到誤刪除:
MariaDB[hellodb]> DROP database hellodb;

恢複前的準備
查看二進位日誌是記錄到了第三個日誌
MariaDB[(none)]> show master logs;
+------------------+-----------+
|Log_name        | File_size |
+------------------+-----------+
|mysql-bin.000001 |      288 |
|mysql-bin.000002 |      577 |
|mysql-bin.000003 |      533 |    #當前日誌的記錄位置
+------------------+-----------+
3rows in set (0.00 sec)
MariaDB[(none)]> show binlog events in 'mysql-bin.000003'\G;
***************************5. row ***************************
  Log_name: mysql-bin.000005
        Pos: 446
 Event_type: Query
  Server_id: 1
End_log_pos:533
      Info: DROP database hellodb      #記錄的刪除語句
5rows in set (0.00 sec)
 
ERROR:No query specified

由於是整個hellodb資料庫遭到誤刪除,所以需要用一開始的完全備份檔案,以及第一天的增量備份檔案,恢複hellodb資料庫和第一天對資料庫進行修改的內容。
第二天對資料庫進行修改的內容恢複:如果直接把當天的二進位日誌匯入到資料庫,由於資料庫中包含了刪除語句,所以資料庫還是會被刪除;所以在匯入第二天二進位日誌時,需要刪除日誌中的DROP語句。
 
將第二天的二進位記錄檔轉換成sql檔案,放到backup目錄下
[root@MariaDB~]# mysqlbinlog /backup/bin-log/mysql-bin.000003 > /backup/2.sql

開啟2.sql檔案可以看到DROP語句,刪除這個語句
# at446
#15061612:15:22 server id 1  end_log_pos 533  Query  thread_id=20    exec_time=0    error_code=0
SETTIMESTAMP=1434428122/*!*/;
DROP database hellodb  #刪除或者注釋這一行

恢複過程:
恢複之前為了避免產生沒有用的二進位日誌,可以關閉二進位日誌的記錄
MariaDB[(none)]> SET SESSION sql_log_bin=0;
將第一次的完全備份資料匯入到資料庫
MariaDB [hellodb]> SOURCE /backup/hellodb-2015-06-16.sql;

查看資料庫已經匯入,但是tb1表不存在
MariaDB[(none)]> use hellodb;
Databasechanged
MariaDB[hellodb]> show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes          |
|coc              |
|courses          |
|scores            |
|students          |
|teachers          |
|toc              |
+-------------------+

匯入第一天增量備份的1.sql檔案。
MariaDB [hellodb]> SOURCE /backup/1.sql;

查看tb1表,發現第一天插入的資料都存在
MariaDB[hellodb]> select * from tb1;
+------+
|id  |
+------+
|    1 |
|    2 |
|    3 |
+------+

匯入當天的2.sql檔案
MariaDB [hellodb]> SOURCE /backup/2.sql;

查看資料已經完全恢複
MariaDB[hellodb]> select * from tb1;
+------+
|id  |
+------+
|    1 |
|    2 |
|    3 |
|  21 |
|  22 |
|  23 |
+------+

恢複完成,啟用記錄二進位日誌
MariaDB[hellodb]> SET SESSION sql_log_bin=1;

特別說明:如果在恢複中關閉二進位日誌,匯入資料必須在Mariadb命令列匯入,如果在shell命令列匯入還是會記錄二進位日誌的。

全庫的備份恢複
備份
第一次完全備份,備份時鎖定表,並滾動二進位日誌
[root@MariaDB ~]# mysqldump -A -u root -p--lock-all-tables --flush-logs --master-data=2 > /backup/ALL-`date +%F`.sql
Enter password:
[root@MariaDB ~]# ll /backup/
total 532
-rw-r--r-- 1 root root    1980 Jun 16 00:46 1.sql
-rw-r--r-- 1 root root    1957 Jun 16 00:52 2.sql
-rw-r--r-- 1 root root  521774 Jun 16 01:04ALL-2015-06-16.sql
drwxr-xr-x 2 mysql mysql  4096 Jun 16 01:04 bin-log
-rw-r--r-- 1 root root    7950 Jun 16 00:43hellodb-2015-06-16.sql

由於備份的時候滾動了二進位日誌,所以備份之後所有對資料庫產生更改的操作都會記錄到mysql-bin.000004中。
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |      288 |
| mysql-bin.000002 |      577 |
| mysql-bin.000003 |      8833 |
| mysql-bin.000004 |      245 |
+------------------+-----------+
4 rows in set (0.00 sec)

備份完成的當天做了一些操作。
MariaDB[hellodb]> delete from tb1 where id=21;
MariaDB[hellodb]> delete from tb1 where id=22;
MariaDB[hellodb]> select * from tb1;
+------+
|id  |
+------+
|    1 |
|    2 |
|    3 |
|  23 |
+------+

第一天��量備份
當天的所有對資料庫變更的語句都會記錄到二進位記錄檔中,只需要滾動二進位日誌,把二進位日誌進行備份即可,二進位滾動之後,第二天的所有對資料庫變更的語句,都會記錄到新的二進位記錄檔中。
MariaDB [hellodb]> flush logs;
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001 |      288 |
| mysql-bin.000002 |      577 |
| mysql-bin.000003 |      8833 |
| mysql-bin.000004 |      670 |
| mysql-bin.000005 |      245 |
+------------------+-----------+
5 rows in set (0.00 sec)

將第一天的二進位記錄檔轉換為sql檔案
[root@MariaDB ~]# mysqlbinlog /backup/bin-log/mysql-bin.000004> /backup/all.1.sql

第二天對資料進行了一些操作
MariaDB[hellodb]> insert into tb1 values (1000),(9000);
MariaDB[hellodb]> select * from tb1;
+------+
|id  |
+------+
|    1 |
|    2 |
|    3 |
|  23 |
|1000 |
|9000 |
+------+

類比故障
刪除資料目錄下的所有檔案,類比資料庫故障:
[root@MariaDB ~]# rm -rf /mydata/data/*

資料庫這個時候還可以登入,但是資料庫都不再了
MariaDB [hellodb]> show databases;
+--------------------+
| Database          |
+--------------------+
| information_schema |
+--------------------+

恢複前的準備
探索資料庫故障先關閉資料庫,但是資料庫無法正常關閉,只能關閉進程
[root@MariaDB ~]# service mysqld stop
MySQL server PID file could not be found!                  [FAILED]
[root@MariaDB ~]# killall mysqld

 
由於資料庫資料目錄的所有內容被刪除,就算是匯入了完全備份檔案也是缺少一些檔案,解決方案就是重新初始化一下資料庫。
[root@MariaDB ~]# cd /usr/local/mysql/
[root@MariaDB mysql]# scripts/mysql_install_db--user=mysql --datadir=/mydata/data/

初始化完成之後,一些基本的檔案都存在了
[root@MariaDB mysql]# ll /mydata/data/
total 36
-rw-rw---- 1 mysql mysql 16384 Jun 16 01:22aria_log.00000001
-rw-rw---- 1 mysql mysql    52 Jun 16 01:22 aria_log_control
-rw-r----- 1 mysql root    80 Jun 16 01:18 MariaDB.err
drwx------ 2 mysql root  4096 Jun 16 01:22 mysql
drwx------ 2 mysql mysql  4096 Jun 16 01:22 performance_schema
drwx------ 2 mysql root  4096 Jun 16 01:22 test

 
將第二天的二進位記錄檔轉換為sql檔案
[root@MariaDB ~]# mysqlbinlog/backup/bin-log/mysql-bin.000005 > /backup/all.2.sql

恢複過程
恢複之前啟動Mysql服務,否則無法匯入備份檔案
[root@MariaDB ~]# service mysqld start

匯入第一天的完全備份檔案,由於剛剛初始化完成資料,這個時候的資料庫還沒有密碼
[root@MariaDB ~]# mysql </backup/ALL-2015-06-16.sql

登入資料庫查看,所有的資料庫都已經恢複,但是第一天對資料庫更改的內容還是沒有恢複
MariaDB [(none)]> show databases;
+--------------------+
| Database          |
+--------------------+
| information_schema |
| hellodb          |
| mysql            |
| performance_schema |
| test              |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> select * from tb1;
+------+
| id  |
+------+
|    1 |
|    2 |
|    3 |
|  21 |
|  22 |
|  23 |
+------+
6 rows in set (0.00 sec)

匯入第一天的增量備份檔案
[root@MariaDB ~]# mysql -u root -p < /backup/all.1.sql

發現第一天刪除的檔案已經不存在,但是第二天添加的內容還是沒有
MariaDB [hellodb]> select * from tb1;
+------+
| id  |
+------+
|    1 |
|    2 |
|    3 |
|  23 |
+------+
4 rows in set (0.00 sec)

匯入第二天的二進位日誌轉換後的sql檔案。
1 [root@MariaDB ~]# mysql -u root -p </backup/all.2.sql

匯入完成之後,資料庫就回到了故障之前的狀態
MariaDB [hellodb]> select * from tb1;
+------+
| id  |
+------+
|    1 |
|    2 |
|    3 |
|  23 |
| 1000 |
| 9000 |
+------+
6 rows in set (0.00 sec)

基於mysqldump快速搭建從庫 

恢複mysqldump建立的備份組 

mysqldump缺失-q參數導致MySQL被oom幹掉

在 CentOS/RHEL/Scientific Linux 6 下安裝 LAMP (Apache with MariaDB and PHP)

MariaDB Proxy讀寫分離的實現

Linux下編譯安裝配置MariaDB資料庫的方法

CentOS系統使用yum安裝MariaDB資料庫

安裝MariaDB與MySQL並存

Ubuntu 上如何將 MySQL 5.5 資料庫遷移到 MariaDB 10 

[翻譯]Ubuntu 14.04 (Trusty) Server 安裝 MariaDB 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.