備份方式一:基於邏輯備份工具mysqldump備份mysql
1、mysqldump: MySQL客戶端工具;邏輯備份工具,查詢請求轉換爲批量插入的insert語句,保存爲SQL腳本;sql
備份整個服務器,單個或部分數據庫,單個或部分表,表中某些行,存儲過程,存儲函數,觸發器;數據庫
能自動記錄備份時的二進制日誌文件及相應position;服務器
1.1直接在mysqldump命令中加讀鎖ide
-x --lock-all-tables 在備份前鎖定全部表,僅對需備份的數據庫函數
-l --lock-tables 在備份前鎖定單表,備一張前鎖一張,但多表間的時間不一致不能保證數據一致。所以只有在備份單表時使用此選項工具
[root@station253 data]# mysqldump -uroot -predhat --databases school cactidb --lock-all-tables > /backup/school_cactidb_full.sqlspa
mysql> show master status;rest
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |日誌
| mysql-bin.000001 | 1314 | | |
還原數據庫,記得先刪除源庫
mysql> source /backup/school_cactidb_full.sql;
1.2--master-data[=#]
這個參數在創建slave數據庫的時候會用到,默認爲0,不作CHANGE MASTER TO這個語句,當這個參數的值爲1的時候,mysqldump出來的文件就會包括CHANGE MASTER TO這個語句,CHANGE MASTER TO後面緊接着就是file和position的記錄,file和position記錄的位置就是slave從master端複製文件的起始位置。默認狀況下這個值是1
當這個值是2的時候,chang master to也是會寫到dump文件裏面去的,可是不會有上面那個做用了,自動註釋掉。
[root@station253 data]# mysqldump -uroot -predhat --master-data=2 --databases school cactidb --lock-all-tables > /backup/school_cactidb_full_3.sql
[root@station253 data]# cat /backup/school_cactidb_full_3.sql | grep 'CHANGE MASTER'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1314;
1.3 mysqldump
--lock-all-tables 鎖定全部表,全部用戶不能執行寫表。對於InnoDB引擎鎖定全部表未必當即生效,buffer pool還未能寫入磁盤。對於全是InnoDB引擎的數據庫使用另一個--single-transaction: 基於此選項能使mysql爲mysqldump建立一個單一大事務應用於所有數據庫,對每張innoDB表建立快照,基於快照實現熱備InnoDB表;
由此,不須要同時使用--lock-all-tables;但會長時間佔用系統資源
完整的備份恢復過程:
備份備份策略:例如每週一次徹底備份+天天一次增量備份(天天定時滾動後備份當天產生二進制日誌)
mysqldump+二進制日誌
備份步驟:
1.徹底備份
2.修庫並增量日誌備份
3.修庫並即時點日誌備份
1.3.1週一作完整備份
[root@station253 data]# mysqldump -uroot -predhat --single-transaction --master-data=2 --databases cactidb > /backup/cactidb_`date +%F`.sql
[root@station253 backup]# ll cactidb_2014-05-22.sql
-rw-r--r-- 1 root root 2123 5月 22 23:59 cactidb_2014-05-22.sql
mysql> show master status; 查看二進制日誌的當前位置
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| mysql-bin.000001 | 1314 | | |
mysql> show binlog events in 'mysql-bin.000001';
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info
| mysql-bin.000001 | 1108 | Query | 1 | 1216 | use `cactidb`; insert into tb1 values(1,'Tom'),(2,'Mary')
| mysql-bin.000001 | 1243 | Query | 1 | 1314 | FLUSH TABLES
1.3.2次日新建表,導出上次徹底備份到昨天增量二進制日誌
mysql> use cactidb;
mysql> CREATE TABLE tb4(id INT);
mysql> INSERT INTO tb4 VALUES (1),(2),(4);
mysql> show master status; 查看二進制日誌的當前位置
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| mysql-bin.000001 | 1602 | | |
導出上次徹底備份到昨天增量二進制日誌
[root@station253 data]# mysqlbinlog --start-position=1314 --stop-position=1602 mysql-bin.000001 > /backup/cactidb_`date +%F_%H`.sql
[root@station253 backup]# cat cactidb_2014-05-23_00.sql
# at 1314
#140523 0:12:00 server id 1 end_log_pos 1404 Query thread_id=3 exec_time=0 error_code=0
use `cactidb`/*!*/;
# at 1575
#140523 0:12:19 server id 1 end_log_pos 1602 Xid = 201
1.3.3第三天新建表,導出上次增量備份到即時點日誌
mysql> use cactidb;
mysql> INSERT INTO tb4 values (5),(9); 未備份的操做
mysql> show master status; 查看二進制日誌的當前位置
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| mysql-bin.000001 | 1796 | | |
mysql> show binlog events in 'mysql-bin.000001'; 查看二進制日誌的詳細內容
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info
| mysql-bin.000001 | 1673 | Query | 1 | 1769 | use `cactidb`; INSERT INTO tb4 values (5),(9) | mysql-bin.000001 | 1769 | Xid | 1 | 1796| COMMIT /* xid=208 */
1.3.4模擬數據庫崩潰
mysql> drop database cactidb;
mysql> show binlog events in 'mysql-bin.000001';
| mysql-bin.000001 | 1796 | Query | 1 | 1883 | drop database cactidb
1.4恢復數據庫步驟
1. 導出上增點到即時點的二進制日誌
2. 重啓並關閉二進制日誌
3. 恢復徹底備份,增量日誌,即時點日誌
4. 打開二進制日誌
1.4.1記錄未備份的二進制日誌,先找出從上次增量備份結束1602到DB崩潰前drop database 1796的二進制日誌
[root@station253 data]# mysqlbinlog --start-position=1602 --stop-position=1796 mysql-bin.000001 > /tmp/cactidb.sql
1.4.2模擬服務器崩潰,重啓服務並從新登陸
[root@station253 data]# ls mysql-bin.*
mysql-bin.000001 mysql-bin.index
[root@station253 data]# service mysqld restart
[root@station253 data]# ls mysql-bin.*
mysql-bin.000001 mysql-bin.000002 mysql-bin.index
[root@station253 ~]# mysql -uroot -predhat
mysql> SET sql_log_bin=0;關閉二進制日誌 ,防止導入時產生重複日誌
mysql> show master status;
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| mysql-bin.000002 | 107 | | |
mysql> 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 | 107 | Server ver: 5.5.33-log, Binlog ver: 4 |
#mysql> flush logs; 滾動出新日誌,如爲記錄能在位於頁首,這裏能夠不用
1.4.3 恢復備份和日誌
1.恢復徹底備份
[root@station253 ~]# mysql -uroot -predhat < /backup/cactidb_2014-05-22.sql
2.恢復增量二進制日誌
[root@station253 ~]# mysql -uroot -predhat < /backup/cactidb_2014-05-23_00.sql
3.恢復未備份的二進制日誌
[root@station253 ~]# mysql -uroot -predhat < /tmp/cactidb.sql
4.檢查恢復的數據庫
mysql> use cactidb;
Database changed
mysql> show tables;
| Tables_in_cactidb |
| tb1 |
| tb4 |
mysql> select * from tb4;
| id |
| 1 |
| 2 |
| 4 |
| 5 |
| 9 |
mysql> show master status;
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| mysql-bin.000002 | 1473 | | |
mysql> show binlog events in 'mysql-bin.000002';
| mysql-bin.000002 | 1350 | Query | 1 | 1446 | use `cactidb`; INSERT INTO tb4 values (5),(9) | mysql-bin.000002 | 1446 | Xid | 1 | 1473 | COMMIT /* xid=86 */
1.4.4 打開二進制日誌
mysql> SET sql_log_bin=1;