使用mysqldump進行mariadb的備份

mysqldump備份介紹mysql

mysqldumpmysql用於轉存儲數據庫的實用程序。它主要產生一個SQL腳本,其中包含從頭從新建立數據庫所必需的命令CREATE TABLE INSERT等,適用於備份數據量不大的數據庫。sql

優勢:備份簡單,恢復容易。shell

備份缺點:schema和數據存儲在一塊兒,巨大的SQL語句、單個巨大的備份文件(備份的庫和表都在一個文件中)。數據庫


mysqldump: 是一個mysql客戶端命令,經過mysql協議鏈接至mysqld,實現數據庫備份vim

命令的語法格式:

   mysqldump [OPTIONS] database [tables]:備份單個庫,或庫指定的一個或多個表bash

mysqldump[OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]:備份一個或多個庫網絡

mysqldump[OPTIONS] --all-databases [OPTIONS]:備份全部庫ide

經常使用選項:

    -A,--all-databases       #備份全部數據庫函數

    InnoDB:spa

        --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文件。

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