1. 程式人生 > >MySQL備份與增量備份

MySQL備份與增量備份

databases server events 數據庫 桃花節

MySQL備份與增量備份

01MySQL備份常用參數

-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

記錄數據庫事件

02MySQL恢復

解壓備份時壓縮的文件:

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所以之後增量備份的數據在最後一個binlogmysql-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備份與增量備份