使用mysqlbinlog配置详民,恢復(fù)數(shù)據(jù)庫
什么是mysqlbinlog
binlog是記錄所有數(shù)據(jù)庫表結(jié)構(gòu)變更(例如CREATE陌兑、ALTER TABLE…)以及表數(shù)據(jù)修改(INSERT、UPDATE由捎、DELETE…)的二進制日志兔综。
binlog不會記錄SELECT和SHOW這類操作,因為這類操作對數(shù)據(jù)本身并沒有修改狞玛,但你可以通過查詢通用日志來查看MySQL執(zhí)行過的所有語句软驰。
使用mysqlbinlog功能必須先在mysql配置binlog,開啟binlog服務(wù)
配置binlog
一.5.7之前心肪,my.cnf/my.ini都在mysql得根目錄下锭亏,只需要在mysqld下面添加配置
log-bin=mysql-bin
binlog-format=Row
server-id=1
解釋:
1.開啟binlog。=mysql-bin這部分參數(shù)可以改成一個路徑存放binlog文件硬鞍,默認是這個配置慧瘤,文件存放到mysql得data文件夾內(nèi)初始化生成mysql-bin.00000x/mysql-bin.index文件
?????? 2.binlog-format有3個參數(shù)
① STATEMENT模式(SBR)
每一條會修改數(shù)據(jù)的sql語句會記錄到binlog中伐坏。優(yōu)點是并不需要記錄每一條sql語句和每一行的數(shù)據(jù)變化,減少了binlog日志量剿骨,節(jié)約IO罚随,提高性能屠升。缺點是在某些情況下會導(dǎo)致master-slave中的數(shù)據(jù)不一致(如sleep()函數(shù)脏答,last_insert_id(),以及user-defined functions(udf)等會出現(xiàn)問題)
② ROW模式(RBR)
不記錄每條sql語句的上下文信息爽丹,僅需記錄哪條數(shù)據(jù)被修改了,修改成什么樣了谤狡。而且不會出現(xiàn)某些特定情況下的存儲過程、或function盈罐、或trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題悄蕾。缺點是會產(chǎn)生大量的日志,尤其是alter table的時候會讓日志暴漲。
③ MIXED模式(MBR)
以上兩種模式的混合使用锄禽,一般的復(fù)制使用STATEMENT模式保存binlog宵晚,對于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog逸贾,MySQL會根據(jù)執(zhí)行的SQL語句選擇日志保存方式咪鲜。
在MySQL 5.7.7之前享郊,默認格式是 STATEMENT玄货。在MySQL 5.7.7及更高版本中隘世,默認值是ROW。 例外:在NDB群集中主儡,默認值是MIXED;
NDB群集不支持基于語句的復(fù)制。
用戶必須有權(quán)SUPER 設(shè)置全局binlog_format值或會話值。
3. server-id,開啟binlog必須設(shè)置此參數(shù)嚷硫,否則報錯负懦,不能啟動服務(wù)蟆盹,值是一個隨機數(shù)舔哪,在主從mysql配置中要設(shè)定不能重復(fù)得值
二.5.7之后
5.7之后my.cnf/my.ini被挪到了mysql根目錄下得bin文件夾,我在此配置中開啟binlog無效胧卤,在mysql根目錄下配置my.cnf/my.ini推捐,內(nèi)容如下:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
log-bin=mysql-bin
binlog-format=Row
server-id=1
即可正常使用,
備注:開啟binlog配置后,個人使用得windows10系統(tǒng)湿滓,在用一些集成工具比如:phpstudy朝氓,wamp啟動mysql得時候不能啟動,權(quán)限不足颜曾,需要在cmd窗口下,使用管理員權(quán)限啟動mysql服務(wù)秉剑。
三.配置好binlog之后檢查配置是否開啟
mysql> show variables like 'log_bin%';?
Log_bin?NO開啟binlog服務(wù)
四.刪庫之后使用備份與binlog文件恢復(fù)數(shù)據(jù)
新建數(shù)據(jù)庫并建表填入數(shù)據(jù)如下
備份數(shù)據(jù)庫泛豪,數(shù)據(jù)id=7,備份后添加幾條數(shù)據(jù)侦鹏,最終表數(shù)據(jù)如下
刪除數(shù)據(jù)庫诡曙,
恢復(fù)數(shù),此時執(zhí)行一次刷新日志索引操作略水,重新開始新的binlog日志記錄文件价卤,理論說已有得binlogn 文件不會再有后續(xù)寫入了(便于我們分析原因及查找pos點),以后所有數(shù)據(jù)庫操作都會寫入到下一個日志文件渊涝;
?????mysql> mysql> flush logs;
?????mysql> show master status;
導(dǎo)入備份數(shù)據(jù)庫文件慎璧,恢復(fù)如下
此時可以看到,id=8跨释,9胸私,10內(nèi)容我們并沒有備份,使用mysql命令查看最新得binlog日志
mysql>show binlog events in 'mysql-bin.000001';
在11694進行了刪庫操作煤傍,恢復(fù)到刪庫操作前一個節(jié)點盖文,11594
進入數(shù)據(jù)庫數(shù)據(jù)文件目錄,本人是windwos10系統(tǒng)蚯姆,進入mysql下得data文件夾洒敏,
從binlog日志恢復(fù)數(shù)據(jù)
?????恢復(fù)語法格式:
?????# mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼數(shù)據(jù)庫名
???????常用選項:
?????????--start-position=953??????????????????起始pos點
?????????--stop-position=1437??????????????????結(jié)束pos點
?????????--start-datetime="2013-11-29 13:18:54"起始時間點
?????????--stop-datetime="2013-11-29 13:21:53"? 結(jié)束時間點
?????????--database=zyyshop????????????????????指定只恢復(fù)zyyshop數(shù)據(jù)庫(一臺主機上往往有多個數(shù)據(jù)庫龄恋,只限本地log日志)
???????不常用選項:???
?????????-u --user=name?????????????Connect to the remote server as username.連接到遠程主機的用戶名
?????????-p --password[=name]???????Password to connect to remote server.連接到遠程主機的密碼
?????????-h --host=name????????????? Getthe binlog from server.從遠程主機上獲取binlog日志
?????????--read-from-remote-server?? Readbinary logs from a MySQL server.從某個MySQL服務(wù)器上讀取binlog日志
實際是將讀出的binlog日志內(nèi)容,通過管道符傳遞給mysql命令凶伙。這些命令郭毕、文件盡量寫成絕對路徑;
我們需要恢復(fù)到11694函荣,命令如下:
報錯如下:
一是在MySQL的配置my.cnf/my.ini中將default-character-set=utf8 修改為character-set-server = utf8显押,但是這需要重啟MySQL服務(wù)扳肛,如果你的MySQL服務(wù)正在忙,那這樣的代價會比較大乘碑。
二是用--no-defaults 命令參數(shù)
5.7之后挖息,mysql不允許在命令行直接鍵入數(shù)據(jù)庫密碼,建議在輸入密碼提示之后在鍵入密碼兽肤,命令行得密碼可以忽略掉套腹,或者在my.cnf/my.ini中配置
最終命令如下:
D:\phpStudy\PHPTutorial\MySQL\data>mysqlbinlog --no-defaults mysql-bin.000001 --stop-position 11694 | mysql -uroot
去看下數(shù)據(jù)庫吧
id8资铡,9电禀,10在沒有備份文件得情況下也恢復(fù)成功,盡量還是要備份好文件笤休,binlog開啟后尖飞,會占用不小得空間,以及一部分mysql性能店雅。