MySQL備份與增量備份
MySQL備份與增量備份
01)MySQL備份常用參數
-B | 1.會備份創建和刪除庫的語句;2.備份多個庫; |
--compact | 去註釋,適合調試 |
gzip | 壓縮:# mysqldump -uroot -pqb123 -S /data/3306/mysql.sock -F -B --master-data=2 mydb|gzip > /server/backup/bak_$(date +%F).sql.gz |
-A | 備份所有庫 |
-F | 刷新binlog日誌 |
--master-data=1/2 | 增加binlog日誌文件及對應的位置點 |
-l | 鎖表 |
-d | 備份表結構 |
-t | 備份表數據 |
--single-transaction | 適合innodb數據庫引擎進行備份 |
--events | 記錄數據庫事件 |
02)MySQL恢復
解壓備份時壓縮的文件:
gzip -d 文件名;
恢復方法:
mysql -uroot -p*** < 備份文件完整路徑
不登錄sql進行操作的方法:
通過echo實現(這個比較常見)
echo "show databases;" | mysql -uroot -p‘qb‘ -S /data/3308/mysql.sock
提示:此法適合單行字符串比較少的情況。
通過mysql -e參數實現
mysql -u root -p‘oldboy‘ -S /data1/3307/mysql.sock -e "show databases;"
查看一些數據庫信息總結:
Show status | 查看當前狀態的數據庫狀態信息 |
Show global status | 查看整個數據庫運行狀態信息 |
Show processlist | 查看正在執行的sql語句 |
Show full processlist | 查看全部正在執行的完整sql語句 |
Show global key_buffer_size=1 | |
Show variables; | 查看 數據庫的參數信息 |
mysql -u root -p‘oldboy‘ -S /data1/3307/mysql.sock -e "show full processlist;"|grep -v Sleep
03)分庫備份腳本實現
04)分庫分表備份腳本實現
05)當誤刪數據庫時,恢復數據庫操作(停庫恢復)
通過防火墻禁止web等應用程序寫數據或者鎖表。讓主庫停止更新,然後進行恢復。
首先要做到常規全備和增量備份:
# mysqldump -uroot -pqb123 -S /data/3306/mysql.sock -F -B --master-data=2 mydb|gzip > /server/backup/bak_$(date +%F).sql.gz
發生了刪除數據庫的操作:
進行檢查增量備份,由於全備加了-F所以之後增量備份的數據在最後一個binlog中mysql-bin.000003
[[email protected] backup]# cd /data/3306/ [[email protected] 3306]# ls data mysql mysql-bin.000002 mysql-bin.index mysql_qb3306.err my.cnf mysql-bin.000001 mysql-bin.000003 mysqld.pid mysql.sock
然後進行恢復:
[[email protected] backup]# gzip -d bak_2017-05-27.sql.gz [[email protected] 3306]# grep -i "change" /server/backup/bak_2017-05-27.sql -- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000003‘, MASTER_LOG_POS=107;
更新binlog。
[[email protected] 3306]# mysqladmin -uroot -pqb123 -S /data/3306/mysql.sock flush-logs [[email protected] 3306]# cp mysql-bin.000003 /server/backup/ [[email protected] 3306]# cd - /server/backup [[email protected] backup]# ls bak_2017-05-27.sql bak.sql.gz mysql-bin.000003 [[email protected] backup]# mysqlbinlog -d mydb mysql-bin.000003 > bin.sql [[email protected] backup]# vim bin.sql 進去刪掉錯誤操作的sql語句。
進行恢復
[[email protected] backup]# mysql -uroot -pqb123 -S /data/3306/mysql.sock <bak_2017-05-27.sql [[email protected] backup]# mysql -uroot -pqb123 -S /data/3306/mysql.sock mydb <bin.sql 完成!
06)被誤刪除數據庫,不停庫恢復
使用主從復制延遲方法!
07)被誤刪除數據庫,不停庫恢復
l 停止一個從庫,然後主庫刷新binlog,把增量備份mysql-bin.000003的數據恢復成bin.sql(去掉drop語句);
l 把全備以及增量恢復到從庫;
l 刷新以後的binlog數據mysql-bin.000004;
l 這個時候停止主庫,快速把刷新以後到binlog數據恢復到從庫;然後切換從庫為主庫提供服務。
l 問題:當不停主庫,將從庫快速切換到主庫的時候,就可能有crud操作,這個時候將主庫之前刷新的數據mysql-bin.000004恢復到現在的主庫的時候,可能會有不可預知的問題;最好的方案是將現在主庫停一下,快速恢復數據然後開啟服務,盡可能少停止主庫。
08) 解析MySQL的binlog日誌
l 日誌作用:用來記錄mysql內部對數據庫更新內容的操作記錄(不會記錄select語句)
l Binlog拆庫: mysqlbinlog -d mydb mysql-bin.000003 > bin.sql(-d指定拆的庫名)
l 指定時間和位置點恢復:mysqlbinlog mysql-bin.000001 --start-position=356 --stop-position=456 -r pos.sql
(指定時間一般不準確)
l Mysqlbinlog不能使用:
原因:my.cnf配置文件[client]下面配置了default-character-set=utf8,這是mysql的一個bug;
解決:變成loose-default-character-set=utf8或者將其註釋。(修改my.cnf之後不需要重啟服務,因為mysqlbinlog是從磁盤上讀my.cnf,不是從內存讀)
09)防止人為誤操作MySQL數據庫
參考http://oldboy.blog.51cto.com/2561410/1321061
------------------------------------------------------------------------
1、mysql幫助說明
[oldboy_c64 ~]# mysql --help|grep dummy -U, --i-am-a-dummy Synonym for option --safe-updates, -U. i-am-a-dummy FALSE
在mysql命令加上選項-U後,當發出沒有WHERE或LIMIT關鍵字的UPDATE或DELETE時,mysql程序就會拒絕執行
2、指定-U登錄測試
[oldboy_c64 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -U Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 14 Server version: 5.5.32-log MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. mysql> delete from oldboy.student; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column mysql> quit Bye
提示:不加條件無法刪除,目的達到。
3、做成別名防止老大和DBA誤操作
[oldboy_c64 ~]# alias mysql=‘mysql -U‘ [oldboy_c64 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15 Server version: 5.5.32-log MySQL Community Server (GPL) Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. mysql> delete from oldboy.student; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column mysql> delete from oldboy.student where Sno=5; Query OK, 1 row affected (0.02 sec) mysql> quit Bye [oldboy_c64 ~]# echo "alias mysql=‘mysql -U‘" >>/etc/profile [oldboy_c64 ~]# . /etc/profile [oldboy_c64 ~]# tail -1 /etc/profile alias mysql=‘mysql -U‘
結論:
在mysql命令加上選項-U後,當發出沒有WHERE或LIMIT關鍵字的UPDATE或DELETE時,mysql程序拒絕執行
--------------------------------------------------------------------------------
本文出自 “qb的博客” 博客,謝絕轉載!
MySQL備份與增量備份