#####################################mysql
常見的數據備份類型和備份工具sql
mysqldump備份工具數據庫
使用LVM邏輯卷快照備份bash
#####################################session
常見的數據備份類型和備份工具
ide
數據的重要性我就很少說了……,常見的數據備份類型是根據不一樣的備份性質和要求來劃分的,他們分別是:根據業務是否可在線、根據物理和邏輯、根據備份範圍,下面就來簡單的掃盲一下:函數
根據業務是否可在線
工具
熱備份:讀寫操做不受影響性能
溫備份:僅能夠執行讀操做測試
冷備份:離線備份,讀寫操做均不能進行
根據物理和邏輯
物理備份:直接複製數據文件,速度快(在文件系統級別完成,不須要mysql進程參與),移植性差。
邏輯備份:將數據導出至文本文件中,速度慢(須要mysql進程參數),移植性好,丟失浮點數精度,能夠方便使用文本處理工具。
根據備份範圍
徹底備份:備份所有數據
增量備份:僅備份上次徹底備份或增量備份之後變化的數據(比增量備份多佔據空間,可是還原的時候方便)
差別備份:僅備份上次徹底備份以來變化的數據
這裏特地盜用一幅圖來更加直觀的闡述增量備份和差別備份的區別:
徹底+增量(還原時間長,複雜,佔用空間小)
徹底+差別(還原時間短,簡單,佔用空間大)
他們之間沒有約束,好比 徹底在線物理備份……
另外備份出的數據要常常測試是否可用,和制定好緊急還原方案………
備份的對象有數據、配置文件、二進制日誌、事務日誌等……
各個備份工具功能和性能對好比下圖所示:
mysqldump備份工具
備份策略:周徹底+每日增量(二進制日誌)
徹底備份
mysql> create database soulboy; Query OK, 1 row affected (0.00 sec) mysql> use soulboy; Database changed mysql> create table tb1 (id int auto_increment primary key,name char(30)); Query OK, 0 rows affected (0.01 sec) mysql> mysql> insert into tb1 (name) values ('kobe'); Query OK, 1 row affected (0.00 sec) mysql> mysql> select * from tb1; #新庫 +----+------+ | id | name | +----+------+ | 1 | kobe | +----+------+ 1 row in set (0.00 sec) 徹底備份,比例中表類型是InnoDB mysqldump -uroot -p --master-data=2 --single-transaction --all-databases > /backup/alldatabases.sql ###########################補充說明############################### mysqldum只能對MyISAM引擎作溫備份,備份以前必須鎖定表,以下: mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /root/alldatabases.sql ##########################mysqldump選項########################### -u #指定用戶名 -p #指定用戶密碼 -h #指定主機地址 -A|--all-databases #備份全部數據庫 --databases #備份指定數據庫 --single-transcation #基於此項能夠實現對InnoDB表作熱備份,但不須要使用 --lock-all-tables #執行備份時爲全部表請求加鎖 -E|--events #備份事件調度器代碼 --opt #同時啓動各類高級選項 -R|--routines #備份存儲過程和存儲函數 --flush-logs #備份以前刷新日誌 --triggers #備份觸發器 --master-data=2 #該選項將會記錄binlog的日誌位置與文件名並追加到文件中,若是爲1將會輸出CHANGE
第一天
mysql> use soulboy; Database changed mysql> insert into tb1 (name) values ('wade'); Query OK, 1 row affected (0.00 sec) mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | kobe | | 2 | wade | +----+------+ 2 rows in set (0.00 sec) ####滾動二進制日誌,進入次日 mysql> FLUSH LOGS; Query OK, 0 rows affected (0.01 sec) ####備份第一天二進制日誌爲SQL格式並重命名爲firstdays.sql mysqlbinlog /mydata/data/mysql-bin.000008 > /backup/firstday.sql
次日
#####插入新數據 mysql> insert into tb1 (name) values ('nash'); Query OK, 1 row affected (0.00 sec) mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | kobe | | 2 | wade | | 3 | nash | +----+------+ 3 rows in set (0.00 sec) #####備份次日二進制日誌爲SQL格式並重命名爲secondday.sql #####注意生產環境中務必將二進制日誌存儲在不一樣於數據目錄的設備中 mysqlbinlog /mydata/data/mysql-bin.000009 > /backup/secondday.sql
模擬故障
cd /mydata/data #####刪除數據目錄中全部文件 rm -rf * cd /usr/local/mysql #####初始化數據庫 scripts/mysql_install_db --user=myslq --datadir=/mydata/data/ #####殺死僵死進程 ps aux | grep mysql kill pid service mysqld restart
數據還原
#####查看當前使用的二進制日誌文件以及所處位置 show master status; #####禁止還原過程當中記錄二進制日誌 mysql> set sql_log_bin=0; #####還原徹底備份 mysql> source /backup/alldatabases.sql; #####還原第一天備份 mysql> source /backup/firstday.sql; #####還原次日備份,所有數據徹底到此結束 mysql> source /backup/secondday.sql; #####開啓二進制日誌記錄功能 mysql> set sql_log_bin=1; #####測試數據是否還原成功 mysql> use soulboy; mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | kobe | | 2 | wade | | 3 | nash | +----+------+ 3 rows in set (0.00 sec)
使用LVM邏輯卷快照備份
鎖表並滾動日誌
#####鎖表 mysql> FLUSH TABLES WITH READ LOCK; #####滾動二進制日誌文件 mysql> FLUSH LOGS; #####即時點恢復時候須要使用,記錄LVM時刻二進制日誌文件和所處位置 mysql -e 'SHOW MASTER STATUS\G' > /backup/master-`date +%F`.info
數據目錄和事務文件建立LVM快照
#####對mydata目錄進行快照 lvcreate -L 200M -s -p r -n mydata-snap /dev/myvg/mydata #####以只讀方式掛載鏡像文件 mount /dev/myvg/mydata-snap /mnt -o ro #####將鏡像文件內容複製到/save目錄中 mkdir /save cp -a /mnt/data/* /save/ #####刪除鏡像文件 umount /mnt lvremove --force /dev/myvg/mydata-snap #####刪除二進制日誌文件 rm -rf /save/mysql-bin.*
解鎖並插入數據
#####解鎖 mysql> UNLOCK TABLES; #####查看當前表內容 mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | kobe | | 2 | wade | | 3 | nash | +----+------+ 3 rows in set (0.00 sec) #####插入新數據,模擬第一天 insert into tb1 (name) values ('firstday'); #####滾動二進制日誌文件,模擬次日 flush logs; insert into tb1 (name) values ('sencondday');
查看快照時間和當前二進制日誌信息
#####查看快照時刻的二進制日誌記錄信息 cat /backup/master-2013-09-19.info *************************** 1. row *************************** File: mysql-bin.000005 Position: 107 Binlog_Do_DB: Binlog_Ignore_DB: #####查看使用當前二進制日誌和所處位置 mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000006 | 343 | | | +------------------+----------+--------------+------------------+
基於多個二進制日誌生成單個SQL格式文件
#####查看快照時刻所處位置的時間點 [root@localhost save]# mysqlbinlog --start-position=107 /mydata/data/mysql-bin.000005 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #130919 11:46:29 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.28-log created 130919 11:46:29 #時間 #####基於時間作限定來合併多個日誌文件爲一個SQL格式的文件 mysqlbinlog --start-datetime='2013-09-19 11:46:29' /mydata/data/mysql-bin.000005 /mydata/data/mysql-bin.000006 > /backup/incremental-`date +%F`.sql
模擬故障
#####中止服務 service mysqld stop #####刪除數目目錄下全部文件 rm -rf /mydata/data/*
還原快照時刻數據
#####複製快照時刻數據到數據目錄 cp -a /save/* /mydata/data/ #####啓動服務 service mysqld start #####查看當前表內數據 mysql> select * from tb1; +----+------+ | id | name | +----+------+ | 1 | kobe | | 2 | wade | | 3 | nash | +----+------+
還原增量數據
#####關閉二進制日誌記錄功能 mysql> set sql_log_bin=0; #####還原增量備份的數據 mysql> source /backup/incremental-2013-09-19.sql #####開啓二進制日誌記錄功能 mysql> set sql_log_bin=0; #####查看錶內數據,還原成功 mysql> select * from tb1; +----+------------+ | id | name | +----+------------+ | 1 | kobe | | 2 | wade | | 3 | nash | | 4 | firstday | | 5 | sencondday | +----+------------+ 5 rows in set (0.00 sec)