數據備份類型:
1、完全備份和部分備份(庫或表)
2、完全備份、增量備份、差異備份
增量備份和差異備份區別在於:增量備份只會備份最近一次完全備份或增量備份(存在增量備份)後的變化的數據,而差異備份會備份完全備份以來的所有變化數據
3、熱備、溫備、冷備
熱備:數據庫正常運行時的備份,
溫備:數據施加讀鎖後進行的備份
冷備:數據庫完全停止後備份
4、物理備份、邏輯備份
物理備份:直接複製數據文件,從而實現備份
邏輯備份:從數據庫中“導出”數據(sql語句)從而進行的備份(與存儲引擎無關)
備份需要考慮因素:
1、當溫備時,施加鎖的時長
2、備份過程所用的時長
3、在線備份時系統的負載
4、恢復時過程所用的時長
備份時所考慮的內容:
1、數據
2、二進制日誌,InnoDB事務日誌
3、數據庫的存儲過程,存儲函數,觸發器,事件調度器
4、服務器的配置文件。這點容易被忽略,試想,服務器掛掉,而又記不起當初的配置參數,可能也會導致還原數據時出現故障。
備份策略:
1、時間:每天,每週,還是每小時
2、備份類型:完全備份+增量還是完全+差異
3、手段:物理備份,邏輯備份
4、備份工具(會受備份類型和手段限制):常見的有mysqldump,LVM快照,xtrabackup
mysqldump備份方式,但是隻應用於下於G級別的備份方式
只備份庫中一個表: [root@mariadb tmp]# mysqldump -uroot mysql db >/tmp/db.table #上面備份的方式不會create表,導入時,需要另外創建表 [root@mariadb tmp]# less db.table -- MySQL dump 10.14 Distrib 5.5.41-MariaDB, for Linux (x86_64) -- -- Host: localhost Database: mysql -- ------------------------------------------------------ -- Server version 5.5.41-MariaDB-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `db` -- DROP TABLE IF EXISTS `db`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `db` ( `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '', `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', PRIMARY KEY (`Host`,`Db`,`User`), KEY `User` (`User`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `db` -- LOCK TABLES `db` WRITE; /*!40000 ALTER TABLE `db` DISABLE KEYS */; INSERT INTO `db` VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y'),('%','test\\_%','','Y','Y','Y','Y','Y','Y','N' ,'Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y'); /*!40000 ALTER TABLE `db` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2015-11-08 1:10:23 (END) ##只備份一個庫 [root@mariadb tmp]# mysqldump -uroot --databases mysql >/tmp/user.db ##同時備份多個庫 [root@mariadb tmp]# mysqldump -uroot --databases hellodb mysql >/tmp/bak.db ##備份所有庫 [root@mariadb tmp]# mysqldump -uroot --all-databases >/tmp/all.db ##但是上面的方式備份,只能用於沒有其他用戶連接且沒有數據處理時
在線備份時,需要施加鎖,
如MyISAM只支持溫備,施加讀鎖定方式:
--lock-tables:鎖定單個數據庫,備份某表
--lock-all-tables:鎖定所有庫的所有表
InnoDB也支持上述方式,但是還支持熱備,需要施加事務鎖
--single-transaction:施加單個事務鎖
其他需要使用的參數
--master-data=2:備份時,記錄二進制日誌事件位置
-E,--events:備份指定數據庫相關的所有event scheduler
-R,--routines:備份指定數據庫相關的所有存儲過程和存儲函數
--triggers:備份表相關的觸發器
--flush-logs:鎖定表完成後,執行flush logs命令,實現日誌滾動
常用到備份方式爲:
[root@mariadb tmp]# mysqldump --all-databases --flush-logs --master-data=2 --lock-all-tables > all.sql
[root@mariadb tmp]# less all.sql #可以看到加了--master-data=2參數後,記錄的binlog文件以及事件的位置
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000004', MASTER_LOG_POS=245;
還原方式:
[root@centos7-4 tmp]# mysql < all.sql #這樣導入會產生二進制日誌
或者:MariaDB [(none)]> source /tmp/all.sql #這樣可以先關閉二進制日誌,再導入不會產生二進制日誌
通過二進制日誌實現即時點還原:
通過完全備份方式,已經還原到了備份節點數據庫上了,現在模擬實時更新數據庫的數據,如在數據中插入一行數據,在完全還原的數據庫中,還原此條數據 MariaDB [hellodb]> INSERT INTO students (Name,Age,Gender) VALUES ("xiaowang",28,"M"); 查看使用的是哪個二進制日誌 MariaDB [hellodb]> show master status; #如果與上一次完全備份不在同一個binlog上,需要分批在備份主機上還原 +----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------+----------+--------------+------------------+ | bin-log.000004 | 546 | | | +----------------+----------+--------------+------------------+ scp 到備份節點數據庫上,在備份節點上,把其完全備份的事件位置後的二進制導出來 如上,已經查看了完全備份時,使用的二進制日誌已經事件位置 CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000004', MASTER_LOG_POS=245; [root@centos7-4 tmp]# mysqlbinlog --start-position=245 /tmp/bin-log.000004 >new.sql 即時點還原 MariaDB [(none)]> SET sql_log_bin=off MariaDB [(none)]> source /tmp/new.sql; MariaDB [hellodb]> SET sql_log_bin=on; MariaDB [hellodb]> select * from students; 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 | | 26 | xiaowang | 28 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ 26 rows in set (0.01 sec) 小王依然恢復到了備份節點上
基於lvm備份
創建pv [root@mariadb ~]# pvcreate /dev/sda7 Physical volume "/dev/sda7" successfully created 創建vg [root@mariadb ~]# vgcreate testvg /dev/sda7 Volume group "testvg" successfully created 創建邏輯卷 [root@mariadb ~]# lvcreate -L 5G -n mydata testvg Logical volume "mydata" created. [root@mariadb ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mydata testvg -wi-a----- 5.00g 格式化文件系統 [root@mariadb ~]# mkfs -t ext4 /dev/testvg/mydata [root@mariadb ~]# mount /dev/testvg/mydata /data/mydata/ [root@mariadb ~]# systemctl start mairadb MariaDB [(none)]> SET sql_log_bin=off MariaDB [(none)]> source /tmp/all.sql MariaDB [hellodb]> SET sql_log_bin=on; 請求施加全局鎖,滾動日誌,以及記錄事件位置 MariaDB [hellodb]> FLUSH TABLES WITH READ LOCK; [root@mariadb ~]# mysql -e "FLUSH LOGS;" [root@mariadb ~]# mysql -e "SHOW MASTER STATUS;" >/root/pos.txt [root@mariadb ~]# cat pos.txt File Position Binlog_Do_DB Binlog_Ignore_DB bin-log.000004 245 創建快照卷 [root@mariadb ~]# lvcreate -L 2G -s -n mydata-snap -p r /dev/testvg/mydata 釋放鎖 MariaDB [hellodb]> UNLOCK TABLES; 備份快照數據,並保存到其他地方,這裏是保存到/tmp/mydata下 [root@mariadb mydata]# mount /dev/testvg/mydata-snap /mnt [root@mariadb mydata]# cd /mnt [root@mariadb mnt]# ls aria_log.00000001 aria_log_control hellodb ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test [root@mariadb mnt]# cp -a * /tmp/mydata/ 刪除快照卷 [root@mariadb ~]# umount /mnt/ [root@mariadb ~]# lvremove /dev/testvg/mydata-snap 插入新數據 MariaDB [hellodb]> INSERT INTO students (Name,Age,Gender) VALUES ("GBlaowang",28,"M"); 假設此時數據庫崩潰了,數據文件丟失了,但是二進制日誌是完好的 systemct stop mariadb.service rm -rf /data/mydata/* 首先要做的是: 1、把二進制日誌保存出來 mv -a /data/binlogs/ /tmp/ 2、把備份文件拷貝到mariadb的datadir下,啓動數據庫 cp -a /tmp/mydata/* /data/mydata/ systemct start mariadb.service 3、快照前的數據依然恢復。但是快照後所插入的數據丟失,則需要通過二進制日誌找回 [root@mariadb ~]# cat pos.txt File Position Binlog_Do_DB Binlog_Ignore_DB bin-log.000004 245 4、在二進制日誌把245後發生的數據找到。 [root@mariadb binlogs]# ls bin-log.000001 bin-log.000002 bin-log.000003 bin-log.000004 bin-log.index [root@mariadb binlogs]# mysqlbinlog --start-position=245 bin-log.000004 > new1.sql 5、即時點還原 MariaDB [hellodb]> SET sql_log_bin=off; MariaDB [hellodb]> source /tmp/binlogs/new1.sql; MariaDB [hellodb]> SET sql_log_bin=on; 找到快照後數據 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 | | 26 | xiaowang | 28 | M | NULL | NULL | | 27 | GBlaowang | 28 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ 27 rows in set (0.01 sec)
基於xtrabackup
備份innodb熱備的前提:是每表都有自己的表空間文件 innodb_file_per_table = on
完全備份 [root@mariadb ~]# innobackupex --user=root /tmp/ 生成的文件 [root@mariadb ~]# ls /tmp/2015-11-07_23-26-21/ backup-my.cnf hellodb ibdata1 mysql performance_schema test xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile 複製到備份主機上 scp -r /tmp/2015-11-07_23-26-21 10.0.0.41:/tmp/ 整理備份文件 [root@centos7-4 tmp]# innobackupex --apply-log 2015-11-07_23-26-21/ 停止mariadb [root@centos7-4 tmp]# systemctl stop mariadb.service 刪除mariadb的數據文件 [root@centos7-4 tmp]# rm -rf /data/mydata/* 還原數據 [root@centos7-4 tmp]# innobackupex --copy-back /tmp/2015-11-07_23-26-21 [root@centos7-4 tmp]# ls /data/mydata/ hellodb ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test xtrabackup_binlog_pos_innodb xtrabackup_info [root@centos7-4 tmp]# chown -R mysql.mysql mydata/ [root@centos7-4 tmp]# rm -rf /data/mydata/ib_logfile* #拷貝中日誌大於數據庫設定的值 數據完整 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 | | 26 | xiaowang | 28 | M | NULL | NULL | | 27 | GBlaowang | 28 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ 27 rows in set (0.01 sec) 增量備份 先刪除掉備份主機上的數據庫數據,再通過完全備份和增量備份還原,以及二進制日誌還原 插入一些數據 MariaDB [hellodb]> use hellodb; MariaDB [hellodb]> CREATE TABLE test (id int); MariaDB [hellodb]> INSERT INTO test VALUES (1),(2),(3); MariaDB [hellodb]> select * from test; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ 備份增量 [root@mariadb ~]# innobackupex --incremental /tmp/ --incremental-basedir=/tmp/2015-11-07_23-26-21 把完全和增量全部copy到備份主機上 [root@mariadb tmp]# scp -r 2015-11-07_23-26-21/ 2015-11-08_00-22-07/ 10.0.0.41:/tmp/ 在備份主機上整理完全備份數據和增量數據 [root@centos7-4 tmp]# innobackupex --apply-log --redo-only 2015-11-07_23-26-21/ [root@centos7-4 tmp]# innobackupex --apply-log --redo-only 2015-11-07_23-26-21/ --incremental-dir=/tmp/2015-11-08_00-22-07/ 還原數據 [root@centos7-4 tmp]# innobackupex --copy-back /tmp/2015-11-07_23-26-21/ [root@centos7-4 tmp]# chown -R mysql.mysql /data/mydata/ 啓動數據查看結果 [root@centos7-4 ~]# systemctl start mariadb.service MariaDB [hellodb]> select * from test; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.01 sec) 再通過二進制日誌即時點還原 先在主數據主機上,的test表中插入一些數據 MariaDB [hellodb]> use hellodb; MariaDB [hellodb]> CREATE TABLE test (id int); MariaDB [hellodb]> INSERT INTO test VALUES (4),(5),(6); MariaDB [hellodb]> select * from test; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +------+ 通過查看增量備份日誌可以看到增量備份時事務位置 [root@centos7-4 2015-11-08_00-22-07]# cat xtrabackup_binlog_info bin-log.000004 1051 把1051後新增的二進制日誌導出 [root@mariadb tmp]# mysqlbinlog --start-position=1051 /data/binlogs/bin-log.000004 >new2.sql 把二進制日誌拷貝到備份主機上 [root@mariadb tmp]# scp new2.sql 10.0.0.41:/root/ 在備註主機上做即時點還原 MariaDB [hellodb]> SET sql_log_bin=off; MariaDB [hellodb]> source /root/new2.sql; MariaDB [hellodb]> SET sql_log_bin=on; MariaDB [hellodb]> select * from test; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +------+