一、mysqldump簡介:
mysqldump是MariaDB自帶的客戶端邏輯備份工具,通過mysql協議連接至mysqld,將需要備份的數據查詢出來,並轉換成對應的insert語句,當需要恢復這些數據時,只要執行這些insert語句,適用於數據量較小的場景。
邏輯備份是指備份SQL語句,在恢復時執行備份SQL,從而實現數據庫數據的重現。備份完成後生成的SQL文件可以使用文本編輯工具直接修改。
二、mysqldump常用選項:
1、--single-transaction:讓備份操作基於“獨立的事務”進行,mysqldump自動將備份會話中的事務隔離級別設置爲“repeatable read”(可重讀),並開啓一個事務,而且事務開始的同時創建了快照,直到備份結束時,都不會讀取到本事務開始之後提交的任何數據,用於保證InnoDB存儲引擎備份數據時的一致性2、--master-data=2:在使用mysqldump進行備份時,會在備份文件中生成對應的change master to語句,此語句記錄當前備份時使用的二進制日誌文件名稱及事件在二進制日誌所在的pos位置,但該change master to語句被註釋
3、-A | --all-databases:備份所有數據庫的所有表,包含建庫及use語句
4、-B | --databases DBNAME1 DBNAME2 ...:備份指定的一個或多個數據庫中的所有表,包含建庫及use語句
5、-d | --no-data:只備份表結構,不備份表數據
6、-E | --events:備份指定數據庫相關的所有事件調度器
7、-F | --flush-logs:備份開始前會滾動一次二進制日誌,並生成一個新日誌文件
8、-l | --lock-tables:備份前鎖定指定數據庫的所有表
9、-q | --quick:此選項對於轉儲大表很有用,它強制mysqldump一次從服務器中檢索一個表的行,而不是檢索整個行集並在將其寫出之前在內存中緩衝它
10、-R | --routines:備份指定數據庫相關的所有存儲過程和存儲函數
11、-t | --no-create-info:只備份表數據,不備份表結構
12、--triggers:備份指定表相關的所有觸發器,默認已啓用該選項
13、-w | --where='where_condition':按條件進行數據備份
14、-x | --lock-all-tables:備份前鎖定所有數據庫的所有表
備註:
(1)對於InnoDB存儲引擎:支持熱備,需要使用--single-transaction選項
(2)對於MyISAM存儲引擎:只支持溫備,備份時需要將--single-transaction選項替換爲-l或-x選項以施加全局讀鎖鎖定備份庫,以保證數據的一致性
三、mysqldump使用示例:
1、備份所有庫的所有表:
# mysqldump -E -F -R -q --single-transaction --master-data=2 -A -uroot -p > all_`date +%F`.sql
2、備份db1、db2數據庫的所有表:
# mysqldump -E -F -R -q --single-transaction --master-data=2 -B db1 db2 -uroot -p > db_`date +%F`.sql
3、備份db1數據庫的所有表:
# mysqldump -E -F -R -q --single-transaction --master-data=2 -B db1 -uroot -p > db1_`date +%F`.sql
4、備份db1數據庫的tb1:
# mysqldump -E -F -R -q --single-transaction --master-data=2 db1 tb1 -uroot -p > tb1_`date +%F`.sql
備註:恢復時需要先創建db1數據庫# mysqladmin -uroot -p create db1
5、備份db1數據庫的tb1表中id大於3的記錄:
# mysqldump -E -F -R -q --single-transaction --master-data=2 db1 tb1 -w 'id>3' -uroot -p > tb1_`date +%F`.sql
備註:恢復時需要先創建db1數據庫# mysqladmin -uroot -p create db1
四、使用mysqldump對db數據庫進行全量備份,並通過二進制日誌進行時間點恢復:
1、演示環境:
IP | 操作系統 | 數據庫版本 | 安裝方式 | 默認存儲引擎 | 角色 |
192.168.1.145 | CentOS 7.6 x86_64 | MariaDB-10.3.15 | yum | InnoDB | 備份 |
192.168.1.146 | CentOS 7.6 x86_64 | MariaDB-10.3.15 | yum | InnoDB | 恢復 |
備註:兩個節點的服務器時間同步
2、兩個節點的server.cnf配置文件如下所示:
# cat /etc/my.cnf.d/server.cnf
[mysqld]
port=3306
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
log-error=/var/log/mariadb.log
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
log-bin=mysql-bin
binlog_format=mixed
sync_binlog=1
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=mariadb-slow.log
3、查看192.168.1.145主機的初始二進制日誌信息:
# mysql -uroot -p
MariaDB [(none)]> show binary logs;
MariaDB [(none)]> show master status;
4、192.168.1.145主機中創建測試數據庫和表:
MariaDB [(none)]> create database db;
MariaDB [(none)]> use db;
MariaDB [db]> create table tb(id int,name varchar(10));
MariaDB [db]> insert into tb values(1,'張三'),(2,'李四'),(3,'王五'),(4,'趙六');
MariaDB [db]> select * from tb;
MariaDB [db]> show master status;
備註:創建測試數據庫和表的操作已記入二進制日誌中
5、192.168.1.145主機的db數據庫通過mysqldump執行全量備份:
# mkdir -pv /backup
# mysqldump -E -F -R -q --single-transaction --master-data=2 -B db -uroot -p > /backup/db_`date +%F`.sql
# less /backup/db_2019-05-20.sql,找到已被註釋的CHANGE MASTER TO語句:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=342;
MariaDB [db]> show binary logs;
MariaDB [db]> show master status;
備註:由於執行mysqldump時附加了-F(--flush-logs)選項,所以二進制日誌滾動,並生成了一個新文件mysql-bin.000002,之後引起數據庫數據變化的操作都會記錄在此二進制日誌文件中,並且新的二進制日誌的事件位置爲385
6、192.168.1.145主機的db數據庫在全量備份後執行如下修改操作:
MariaDB [db]> insert into tb values(5,'jack'),(6,'mary');
MariaDB [db]> delete from tb where id=3;
MariaDB [db]> update tb set name='keyso' where id=2;
MariaDB [db]> select * from tb;
MariaDB [db]> show master status;
備註:db數據庫的修改操作已記入二進制日誌中
7、192.168.1.145主機滾動二進制日誌,並通過mysqlbinlog導出sql語句,進行增量備份:
# mysqladmin -uroot -p flush-binary-log
# mysqlbinlog -uroot -p -j 342 /var/lib/mysql/mysql-bin.000002 | less
# mysqlbinlog -uroot -p -j 342 /var/lib/mysql/mysql-bin.000002 > /backup/incre_`date +%F`.sql
備註:-j選項中的342和mysql-bin.000002來自上述CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=342;語句
MariaDB [db]> show binary logs;
MariaDB [db]> show master status;
8、將192.168.1.145主機/backup目錄中的db_2019-05-20.sql和incre_2019-05-20.sql複製至192.168.1.146主機/backup目錄中:
# scp /backup/*.sql [email protected]:/backup
9、192.168.1.146主機恢復數據前關閉會話級別二進制日誌:
# mysql -uroot -p
MariaDB [(none)]> show variables like 'sql_log_bin';
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> show variables like 'sql_log_bin';
10、查看192.168.1.146主機的初始二進制日誌信息:
MariaDB [(none)]> show binary logs;
MariaDB [(none)]> show master status;
11、192.168.1.146主機導入全量備份db_2019-05-20.sql:
MariaDB [(none)]> source /backup/db_2019-05-20.sql
MariaDB [(none)]> select * from db.tb;
12、192.168.1.146主機導入增量備份incre_2019-05-20.sql,根據二進制日誌進行時間點恢復,將全量備份之後的修改操作進行重放,全部導入操作執行成功後開啓會話級別二進制日誌:
MariaDB [(none)]> source /backup/incre_2019-05-20.sql
MariaDB [(none)]> select * from db.tb;
MariaDB [(none)]> show master status;
備註:二進制日誌中事件位置沒有發生變化,說明導入操作沒有記入二進制日誌中
MariaDB [(none)]> set sql_log_bin=1;
MariaDB [(none)]> show variables like 'sql_log_bin';
備註:下一次的增量備份執行時先滾動二進制日誌,然後通過mysqlbinlog命令將mysql-bin.000003中的sql語句導出爲.sql文件,複製至192.168.1.146主機進行恢復即可,恢復數據前關閉會話級別的二進制日誌