mysqldump備份介紹mysql
mysqldump是mysql用於轉存儲數據庫的實用程序。它主要產生一個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)