1.mysqldump:
shell> mysqldump [options] db_name [tbl_name ...] #可以備份單個數據庫的單個表,不會自動創建數據庫,恢復時需要先創建數據庫 shell> mysqldump [options] --databases db_name ... shell> mysqldump [options] --all-databases 例如: mysqldump -uroot --databases hellodb > /root/hellodbbak.sql #僅備份一個數據庫 mysqldump -uroot --databases hellodb mysql > /root/dbbak.sql #同時備份多個庫
對於MyIsam引擎的數據庫:
MyISAM:支持溫備;鎖定備份庫,而後啓動備份操作;
鎖定方法:
--lock-all-tables:鎖定所有庫的所有表;
--lock-tables:對於每個單獨的數據庫,在啓動備份之前鎖定其所有表
上面兩個參數對InnoDB表一樣生效,實現溫備;
InnoDB:支持熱備;
--single-transaction 備份數據前啓動一個事務,達到數據一致效果
其它選項:
-E, --events:備份指定數據庫相關的所有event scheduler;
-R, --routines:備份指定數據庫相關的所有存儲過程和存儲函數;
--triggers:備份表相關的觸發器;
--master-data[=#]:
1:記錄爲CHANGE MASTER TO語句,此語句不被註釋;
2:記錄爲註釋的CHANGE MASTER TO語句;
CHANGE MASTER TO記錄了啓動備份前時間處於哪個二進制文件的哪個位置
--flush-logs:鎖定表完成後,執行flush logs命令可以實現二進制日誌滾動
注意:二進制日誌文件不應該與數據文件放在同一磁盤;二進制日誌文件記錄了全庫信息,不能執行單獨庫還原,除非編輯它只針對一個庫作用後再還原。
應該經常對二進制文件做增量備份,例如每過半填,讓二進制日誌自動滾動一次,把之前的備份起來。
示例: [root@testserver ~]# mysqldump -uroot --databases hellodb --lock-tables --master-data=2 > /root/hellodbbak.sql [root@testserver ~]# less hellodbbak.sql | grep CHANGE -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=7655;#這樣就得到了當前使用的二進制日誌文件名和當前記錄位置 修改當前庫裏的某些數據: MariaDB [hellodb]> INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES ('Chao Gai',47,'M',3,7); Query OK, 1 row affected (0.00 sec) DELETE FROM students WHERE StuID=3; Query OK, 1 row affected (0.00 sec) 此時mysql服務器掛了,我們把數據還原到另一個服務器上,執行恢復操作: 還原前要注意先要關掉二進制日誌,否則產生大量IO set sql_log_bin=0,等還原完成再開啓,還原時在mysql交互式模式下用source命令 [root@node1 ~]# mysql < hellodbbak.sql 查看恢復的狀況:發現沒有完全恢復:晁蓋沒進來,謝煙客還在 MariaDB [hellodb]> SELECT * FROM students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 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 | 17 | 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 | +-------+---------------+-----+--------+---------+-----------+ 25 rows in set (0.00 sec) 繼續使用二進制文件恢復:根據上面列出來的二進制日誌文件和當前記錄位置 [root@testserver ~]# mysqlbinlog --start-position=7655 /mydata/data/mysql-bin.000011 > incre.sql 看一下這個二進制日誌文件: [root@testserver ~]# mysqlbinlog --start-position 7655 /mydata/data/mysql-bin.000011 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #151110 21:35:57 server id 1 end_log_pos 245 Start: binlog v 4, server v 5.5.44-MariaDB-log created 151110 21:35:57 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' vfJBVg8BAAAA8QAAAPUAAAABAAQANS41LjQ0LU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAC98kFWEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA8nm5Lg== '/*!*/; # at 7655 #151110 23:14:20 server id 1 end_log_pos 7726 Query thread_id=10 exec_time=0 error_code=0 SET TIMESTAMP=1447168460/*!*/; SET @@session.pseudo_thread_id=10/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 7726 #151110 23:14:20 server id 1 end_log_pos 7754 Intvar SET INSERT_ID=26/*!*/; # at 7754 #151110 23:14:20 server id 1 end_log_pos 7907 Query thread_id=10 exec_time=0 error_code=0 use `hellodb`/*!*/; SET TIMESTAMP=1447168460/*!*/; INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES ('Chao Gai',47,'M',3,7) /*!*/; # at 7907 #151110 23:14:20 server id 1 end_log_pos 7934 Xid = 780 COMMIT/*!*/; # at 7934 #151110 23:16:55 server id 1 end_log_pos 8005 Query thread_id=10 exec_time=0 error_code=0 SET TIMESTAMP=1447168615/*!*/; BEGIN /*!*/; # at 8005 #151110 23:16:55 server id 1 end_log_pos 8105 Query thread_id=10 exec_time=0 error_code=0 SET TIMESTAMP=1447168615/*!*/; DELETE FROM students WHERE StuID=3 /*!*/; # at 8105 #151110 23:16:55 server id 1 end_log_pos 8132 Xid = 781 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; 拷貝到那臺好的服務器進行還原: [root@testserver ~]# scp incre.sql [email protected]:/root/ [email protected]'s password: incre.sql 100% 2373 2.3KB/s 00:00 [root@node1 ~]# mysql < incre.sql 查看:發現謝煙客沒了,晁蓋來了,數據被完整恢復了! +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 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 | 17 | 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 | | 26 | Chao Gai | 47 | M | 3 | 7 | +-------+---------------+-----+--------+---------+-----------+ 25 rows in set (0.00 sec)
2.基於LVM2進行熱備:
創建一個mysql的數據目錄,使用lvm: [root@testserver ~]# fdisk /dev/sda WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): Value out of range. Partition number (1-4): 3 First cylinder (7859-15665, default 7859): Using default value 7859 Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +20G Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): 8e Changed system type of partition 3 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! 做LVM: [root@testserver ~]# partx -a /dev/sda BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2 BLKPG: Device or resource busy error adding partition 3 [root@testserver ~]# pvcreate /dev/sda3 Physical volume "/dev/sda3" successfully created [root@testserver ~]# vgcreate myvg /dev/sda3 Volume group "myvg" successfully created [root@testserver ~]# lvcreate -L 10G -n mydata myvg Logical volume "mydata" created [root@testserver ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mydata myvg -wi-a----- 10.00g root vg0 -wi-ao---- 20.00g swap vg0 -wi-ao---- 2.00g usr vg0 -wi-ao---- 10.00g var vg0 -wi-ao---- 20.00g 格式化: mke2fs -t ext4 /dev/myvg/mydata 開機自動掛載: mkdir /mydata/ 在fstab文件中添加/dev/myvg/mydata /mydata ext4 defaults 0 0 mount -a mkdir /mydata/data chown mysql.mysql /mydata/data/ -R 編輯my.cnf:在mysqld段加如下內容 datadir=/mydata/data innodb_file_per_table = ON skip_name_resolve = ON log-bin=mysql-bin binlog_format=mixed 啓動mysql service mysqld start 現在先導入一個數據庫,就用前面的備份文件 cp hellodbbak.sql incre.sql /tmp MariaDB [(none)]> set sql_log_bin=0 #臨時關閉二進制日誌 -> ; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> source /tmp/hellodbbak.sql; #導入 MariaDB [hellodb]> SET sql_log_bin=1; #開啓二進制日誌 Query OK, 0 rows affected (0.00 sec) 查看二進制日誌狀態: MariaDB [(none)]> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 245 | | mysql-bin.000002 | 245 | +------------------+-----------+ 2 rows in set (0.00 sec) MariaDB [(none)]> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 245 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 因爲導入時關閉了二進制日誌功能,所以沒有產生新的二進制日誌,避免了大量IO MariaDB [(none)]> SHOW BINLOG EVENTS IN 'mysql-bin.000002'; +------------------+-----+-------------+-----------+-------------+-----------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+-----------------------------------------------+ | mysql-bin.000002 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.44-MariaDB-log, Binlog ver: 4 | +------------------+-----+-------------+-----------+-------------+-----------------------------------------------+ (1) 請求鎖定所有表; mysql> FLUSH TABLES WITH READ LOCK; (2) 記錄二進制日誌文件及事件位置;可以先滾動下日誌 mysql> FLUSH LOGS; MariaDB [(none)]> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 245 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> FLUSH LOGS; Query OK, 0 rows affected (0.49 sec) MariaDB [(none)]> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 245 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.02 sec) mysql> SHOW MASTER STATUS; 好的方法: mysql -e 'flush logs;' mysql -e 'SHOW MASTER STATUS' > /tmp/pos.`date +%F` (3) 創建快照; [root@testserver ~]# lvcreate -L 500M -n mydata-snap -p r -s /dev/myvg/mydata Logical volume "mydata-snap" created (4) 釋放鎖 mysql> UNLOCK TABLES; (5) 掛載快照卷,執行數據備份; (6) 備份完成後,刪除快照卷; (7) 制定好策略,通過原卷備份二進制日誌; 刪除兩行試試: MariaDB [(none)]> use hellodb; Database changed MariaDB [hellodb]> DELETE FROM students WHERE StuID=5 -> ; Query OK, 1 row affected (0.05 sec) MariaDB [hellodb]> DELETE FROM students WHERE StuID=11; Query OK, 1 row affected (0.08 sec) 二進制日誌position從245變到了642 MariaDB [hellodb]> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 642 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.01 sec) 掛載快照卷: mount -r /dev/myvg/mydata-snap /mnt/ 查看快照裏的內容 [root@testserver data]# ls /mnt/ data [root@testserver data]# ls /mnt/data/ aria_log.00000001 ibdata1 mysql mysql-bin.index aria_log_control ib_logfile0 mysql-bin.000001 testserver.err hellodb ib_logfile1 mysql-bin.000002 testserver.pid 執行備份: [root@testserver data]# cp -a /mnt/data/ /tmp/ [root@testserver mysql]# rm -rf mysql-bin.* [root@testserver data]# cp -a /mydata/data/mysql-bin.000003 /tmp 模擬故障: service mysqld stop [root@testserver data]# rm -rf /mydata/data/* 還原: root@testserver data]# cp -a /tmp/data/* /mydata/data/ 重啓查看: MariaDB [(none)]> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 245 | +------------------+-----------+ 1 row in set (0.00 sec) MariaDB [hellodb]> SELECT * FROM students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 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 | 17 | 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 | +-------+---------------+-----+--------+---------+-----------+ 25 rows in set (0.01 sec) 使用bin-log繼續繼續恢復: 查看位置: less /tmp/pos.2015-11-11 mysqlbinlog --start-position=245 /tmp/mysql-bin.000003 > /tmp/incre.sql mysql < /tmp/incre.sql(這裏應該使用source命令導入,臨時關閉sql_log_bin) 恢復完成: MariaDB [hellodb]> SELECT * FROM students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 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 | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | 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 | +-------+---------------+-----+--------+---------+-----------+ 23 rows in set (0.00 sec)
3.xtrabackup實現備份:
使用日誌序列號lsn來識別時增量備份還是完全備份,以及保證增量備份可以在線進行