前言
系列文章:
1.MySQL主從復制
2.OneProxy實現MySQL讀寫分離
3.MySQL數據庫結構設計
4.MySQL基于GTID主從復制的雜談
5.MySQL復制性能優化和常見問題分析
mysqldump全量恢復
1.創建douyin
數據庫、tbl_douyin_author
數據庫表、插入測試數據。
create table tbl_douyin_author(
id int not null auto_increment,
author_name varchar(50) not null,
PRIMARY key (id)
)
insert into tbl_douyin_author values(null, "程序員小馬");
select * from tbl_douyin_author;
2.利用mysqldump進行備份,涉及到的參數就不一一開講了。
mysqldump --single-transaction
--master-data --triggers --routines
--databases douyin
--set-gtid-purged=OFF --flush-logs -uroot -pxiaoma
> douyin-dump.sql
無論是完整備份,還是部分備份。如果不設置
--set-gtid-purged=OFF
這個參數,最終的備份文件中會有這樣一句話:SET @@GLOBAL.GTID_PURGED='de3a31d3-e97e-11e8-be60-144f8aee24be:1-318402';
這個的區間是主庫中當前所完成的所有事務號。這條語句在備份被恢復的時候,起到的作用是:不再從主庫同步1-318402
這個范圍內的事務了。如果我們是部分備份,我們不應該阻止從庫同步1-318402
全部區間的數據。因此部分備份是加上--set-gtid-purged=OFF
這句,不強行指定跳過這些操作。--single-transaction
、--master-data=2
、--flush-logs
達到了減少鎖定時間的目的,同時又達到了一致性的備份的目的,而且該一致性備份和 flush的binlog日志也是一致的。話外音:--single-transaction
利用事務的特性來得到一致性備份,將隔離級別設置為:REPEATABLE READ
。并且隨后再執行一條START TRANSACTION
語句,讓整個數據在dump過程中保證數據的一致性,這個選項對InnoDB
的數據表很有用,且不會鎖表。但是這個不能保證MyISAM
表和MEMORY
表的數據一致性。為了確保使用
--single-transaction
命令時,保證dump
文件的有效性。需沒有下列語句ALTER TABLE
,CREATE TABLE
,DROP TABLE
,RENAME TABLE
,TRUNCATE TABLE
,因為一致性讀不能隔離上述語句。所以如果在dump
過程中,使用上述語句,可能會導致dump
出來的文件數據不一致或者不可用。
3.刪除douyin
數據庫
drop database douyin;
4.利用douyin-dump.sql
進行恢復
mysql -uroot -pxiaoma < douyin-dump.sql
mysqlbinlog增量恢復
1.我們接著在tbl_douyin_author
插入4條數據
insert into tbl_douyin_author values(null, "達達");
insert into tbl_douyin_author values(null, "麻辣德子");
insert into tbl_douyin_author values(null, "翔翔大作戰");
insert into tbl_douyin_author values(null, "五月天");
select * from tbl_douyin_author;
2.如果我們在這個時候,不一小心進行了drop DATABASE douyin;
的刪庫操作。想必大家的第一反應是收拾行李,趕緊跑路把!但是飯要慢慢吃,路要慢慢走,我們靜下心來還是能夠解決這個棘手的問題的!怎么解決呢?首先用douyin-dump.sql
全量備份恢復到tbl_douyin_author
表只有一條數據的狀態
3.看到這里,你肯定又會疑問了,這才恢復了一條數據啊,還有4條數據呢!不要急,看我操作就行了。查看binlog中的事件。
show binlog events in 'mysql-bin.000047'\g
4.我們已經確定了1641點的操作導致了刪除douyin
數據庫,所以我們要開始恢復的點是1576至以前。接下來我們就可以從binlog日志恢復數據了。
恢復語法格式:
# mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數據庫名
常用選項:
--start-position=55 起始pos點
--stop-position=555 結束pos點
--start-datetime="2019-11-29 13:00:00" 起始時間點
--stop-datetime="2019-11-29 17:00:00" 結束時間點
--database=douyin 指定只恢復douyin數據庫(一臺主機上往往有多個數據庫,只限本地log日志)
不常用選項:
-u --user=name Connect to the remote server as username.連接到遠程主機的用戶名
-p --password[=name] Password to connect to remote server.連接到遠程主機的密碼
-h --host=name Get the binlog from server.從遠程主機上獲取binlog日志
--read-from-remote-server Read binary logs from a MySQL server.從某個MySQL服務器上讀取binlog日志
5.執行mysqlbinlog --stop-position=1576 --skip-gtids=true --database=douyin mysql-bin.000047 | mysql -uroot -pxiaoma
命令,tbl_douyin_author
里面的數據恢復成功。
- 如果我們是要恢復數據到源數據庫或者和源數據庫有相同 GTID 信息的實例,那么就要使用
--skip-gtids=true
參數。如果不帶該參數的話,是無法恢復成功的。因為包含的 GTID 已經在源數據庫執行過了,根據 GTID 特性,一個 GTID 信息在一個數據庫只能執行一次,所以不會恢復成功。
尾言
不管是神還是惡魔都不會對不抗爭的人伸出援手。