MySQL 數據庫的備份與恢復
1.1 備份數據的意義
第一是保護公司的數據,第二是網站7*24小時提供服務
1.2 備份單個數據庫參數使用
MySQL數據庫自帶了一個很好用的備份命令,就是mysqldump,它的基本使用如下;
語法:mysqldump -u 用戶名 -p ?數據庫名 > 備份的文件名
mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy >/opt/oldboy_$(date +%F).sql 我們可以使用grep 查看我們都備份了些什么東西
[root@db02 oldboy]# egrep -v "#|\*|--|^$" /opt/oldboy_2016-06-22.sql DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( ? `id` int(4) NOT NULL AUTO_INCREMENT, ? `name` char(20) NOT NULL, ? `age` tinyint(2) NOT NULL DEFAULT '0', ? `dept` varchar(16) DEFAULT NULL, ? PRIMARY KEY (`id`), ? KEY `index_name` (`name`), ? KEY `index_age` (`name`(8)), ? KEY `ind_name_dept` (`name`,`dept`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `student` WRITE; UNLOCK TABLES; DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( ? `id` int(4) NOT NULL AUTO_INCREMENT, ? `name` char(20) NOT NULL, ? PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'); UNLOCK TABLES; 小結:mysqldump就是備份了我們的sql語句
mysqldump常用參數說明: 參數
說明
-A
備份所有數據庫
-B
增加創建數據庫和連接數據庫的語句
-t
只備份數據
-d
只備份庫表結構
-T
分離庫表和數據成不同的文件,數據是文本,非SQL語句
-x
鎖表 禁止寫入數據
-F
刷新binlog日志,生成新的文件,將來增量恢復使用
我們這里只是簡單的介紹了一下mysqldump的參數,更多參數可以參考本站的
mysqldump 參數介紹
1.3 常用命令介紹 -B? 使用-B 參數
mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy >/opt/oldboy_B_$(date +%F).sql
不使用-B 參數
[root@db02 oldboy]# mysql -uroot -p123456 -S /data/3306/mysql.sock </opt/oldboy_2016-06-22.sql?
小結:如果不加-B?恢復的時候需要提前創建好數據庫并指定
–compact 測試時用的比較多,可以優化輸出內容的大小,讓容量更少,適合調試 參數說明:該選項使得輸出內容更簡潔,不包括默認選項中各種注釋,有如下幾個參數。–skip-add-drop-table –no-set-names
–skip-disable-keys –skip-add-locks 語法如下:
mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy --compact >/opt/123.sql gzip mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy|gzip>/opt/123.sql.gz -rw-r--r-- ?1 root root ?899 Jun 22 17:34 123.sql.gz -rw-r--r-- ?1 root root 1014 Jun 22 17:27 123.sql 使用gzip壓縮打包文件效率是不壓縮的3倍
以上參數小結 備份數據使用-B參數,會在備份數據中增加建庫的語句。 備份數據使用-B參數,后面可以直接接多個庫名 用gzip對備份的數據壓縮,可以提高效率 debug時可以用–compact減少輸出,但不用于生產 指定字符集備份用–default-character-set=latin1(一般不用此字符集) mysqldump的工作原理? 利用mysqldump命令備份數據的過程,實際上就是把數據從mysql庫里以邏輯的sql語句的形式直接輸出或生產備份文件的過程 備份多個庫語法如下:
mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy wordpress >/opt/123.sql 提示:使用mysqldump是把數據庫的數據導出通過sql語句的形式存儲,這種備份方式成稱為邏輯備份,效率不是很高,一般50G以內的數據。 其他的備份方式:物理備份cp、tar(停庫),xtrabackup 1.4 如果做分庫分表 分庫備份實際上就是執行一個備份語句備份一個庫,如果數據庫里有多個庫,就執行多條相同的備份單個的備份語句就可以備份多個庫了。注意每個庫都可以對應備份的庫作為庫名,結尾加sql備份多個庫的命令如下:
mysqldump -uroot -p123456 -B oldboy mysqldump -uroot -p123456 -B oldboy_gbk 分庫的備份語法: 先取出我們要備份的庫
[root@db02 oldboy]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;"|egrep -v "Database|_schema|mysql" cyh oldboy oldboy123 oldboy_gbk wordpress 執行命令,進行批量備份
mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;"|egrep -v "Database|_schema|mysql"|sed -r 's#^(.*)#mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B \1 >/tmp/\1.sql.gz#g'|bash ?查看最后結果
[root@db02 tmp]# ll total 20 -rw-r--r-- 1 root root??? 0 Jun 21 11:55 bak.sql -rw-r--r-- 1 root root 1382 Jun 22 17:55 cyh.sql.gz -rw-r--r-- 1 root root 1406 Jun 22 17:55 oldboy123.sql.gz -rw-r--r-- 1 root root 1409 Jun 22 17:55 oldboy_gbk.sql.gz -rw-r--r-- 1 root root 2808 Jun 22 17:55 oldboy.sql.gz -rw-r--r-- 1 root root 1406 Jun 22 17:55 wordpress.sql.gz 提示:可以使用for循環進行備份 備份單個表
mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test >/opt/test.sql 備份多個表
mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test cyh>/opt/test.sql [提示]只要不加-B 前面是庫,后面的都是表 只顯示表結構
mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test? -d >/opt/test.sql 直接備份數據 -t參數
mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test? -t>/opt/test.sql 備份數據庫表結構(不包含數據)
利用mysqldump -d?參數只備份表的結構,例:備份oldboy所有表結構
mysqldump -uroot -p123546 -B -d oldboy >/opt/t.sql 語句和數據分離,數據為文本 -T -tab=name
mysqldump -uroot -p123456 oldboy student –compact –tab=/tmp/ cat /tmp/student.txt oldboy oldgirl inca ?zuma 刷新binlog
mysqldump用于定時對某一時刻的數據的全備,例如:00點進行備份back.sql.gz
增量備份:當有數據寫入到數據庫時,還會同時把更新的SQL語句寫入到對應的文件里這個就叫做binlog文件
mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test -F --compact -F 在/data/3306就會記錄mysql-bin.000005 按照循序設置,刷新binglog日志,在備份之后立刻刷新binlog日志
刷新binlog介紹 binlog是記錄數據庫更新的SQL語句,二進制文件 mysqldump永不定時對某一時刻數據的全備,例如:00點進行備份bak.sql.gz 增量備份:當有數據寫入到數據庫時,還會同時把更新的SQL語句寫入到對應的文件里 這個文件就叫做binlog文件 例子:10點丟失數據需要恢復數據;
00點時刻備份的bak.sql.gz 數據還原到數據庫,這個時候恢復到了00點 00點-10:00數據,就要從binlog里恢復 binlog文件生效需要有一個參數:binlog binlog日志切割:確定全備和增量的臨界點
-F 刷新binlog日志,生成新文件,將來恢復從這個文件開始。 –maser-data在備份語句里添加CHANGE MASTER語句及binlog文件位置點信息 值為1=可執行的CHANGE MASTER語句 值為2=注釋的–CHANGE MASTER語句 –master-data除了增量恢復確定臨界點外,做主從復制時作用更大。 1.5 生產場景不同引擎mysqldump備份命令 MyISAM引擎企業生產備份命令(適合所有引擎和混合引擎)
mysqldump -uroot -poldboy123 -A -B -F -R --master-data=2 -x --events|gzip >/opt/all.sql.gz 提示:-F 也可以不用,與--master-data有些重復 innoDB引擎企業生產備份命令;推薦使用的
mysqldump -uroot —poldboy123 -A -B -F -R --master-data=2 --events --single-transaction|gzip >/opt/all.sql.gz 提示:-F 也可以不用,與--master-data 額外補充: (一)mysqldump邏輯備份說明 缺點:效率不是特別高。 優點:簡單、方便、可靠、遷移 適用于數據量不是特別大的場景,打包前50G以內數據 (二)超過50G可選方案 1、xtrabackup物理備份工具:全量和增量(支持熱備) 2、物理備份方案:從庫停止SQL線程,打包,cp
數據庫恢復事項 提示: 1.數據恢復和字符集關聯很大,如果字符集不正確會導致恢復的數據亂碼 2.mysql命令以及source命令恢復數據庫的原理就是把文件的sql語句,在數據庫重新執行的過程
小技巧 Mysql>system ls -l /opt/ ?可以跳出mysql查看命令 Mysql>source /opt/oldboy_B.sql ?直接接路徑就可以恢復 source數據恢復和字符集關聯很大,如果字符集不正確會導致恢復的數據亂碼 UTF8數據庫,那么恢復的文件格式需要為"UTF8-沒有簽名"格式,txt右擊另存為設置 1.6 MySQL恢復命令 針對壓縮的備份數據恢復; 1、方法
gzip -d /opt/mysql.sql.gz mysql -uroot -poldboy </opt/mysql.sql 不刪除源備份文件: gzip -cd 01.sql.gz >2.sql 2、方法
gunzip<b_bak.sql.gz>/opt/mysql.sql mysql -uroot -poldboy </opt/mysql.sql 或者 gunzip <b_bak.sql.gz|mysql -uroot -poldboy123 恢復總結: 1、source命令 2、mysql命令
1.7 實現和MySQL非交互式對話 1.7.1 利用mysql -e 參數查看mysql數據 [root@www ~]# mysql -uroot -p -e "show databases;" Enter password:? +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | bbs ? ? ? ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | performance_schema | | test ? ? ? ? ? ? ? | | wordpress ? ? ? ? ?| +--------------------+ 查看完整的線程狀態,此參數才查看慢查詢語句是非常有用
[root@www ~]# mysql -uroot -p -e "show full processlist;" Enter password:? +-----+------+-----------+------+---------+------+-------+-----------------------+ | Id ?| User | Host ? ? ?| db ? | Command | Time | State | Info ? ? ? ? ? ? ? ? ?| +-----+------+-----------+------+---------+------+-------+-----------------------+ | 797 | root | localhost | NULL | Query ? | ? ?0 | NULL ?| show full processlist | +-----+------+-----------+------+---------+------+-------+-----------------------+ 企業案例:mysql sleep線程過多的問題案例
mysql> show processlist; mysql>kill 89; ?可以使用kill 殺死進程 ============================================= mysql sleep線程過多問題 在配置文件修改:
[mysqld] interactive_timeout = 120 ?<==此參數設置后wait_timout自動失效 wait_timeout = 120 其他方法: 1、PHP程序中,不使用持續連接,即使用mysql_connect而不是pconnect(JAVA調整連接池) 2、PHP程序執行完畢,應該顯示調用mysql_close 3、逐漸分析MySQL的SQL查詢及慢查詢日志,找到查詢過慢的SQL,優化
1.8 不重啟數據庫修改數據庫參數 不重啟數據庫修改數據庫參數,但是要求重啟后還能生效
shell>mysql -uroot -poldboy -e "show variables;"|grep key_buffer key_buffer_size 16384 shell>mysql -uroot -poldboy -e "set global key_buffer_size = 1024*32;" shell>mysql -uroot -poldboy -e "show variables;"|grep key_buffer key_buffer_size 32768 shell>sed -n '32p' /etc/my.cnf key_buffer_size = 16K shell>sed -i 's#key_buffer_size = 16K#key_buffer_size = 32K#g' /etc/my.cnf 查看數據庫參數是否生效
mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables\G" [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%server_id%';" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id???? | 1???? | +---------------+-------+ 查看my配置文件有沒有在數據庫中生效
?
[root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%log_bin%';" +---------------------------------+-------+ | Variable_name?????????????????? | Value | +---------------------------------+-------+ | log_bin???????????????????????? | ON??? | | log_bin_trust_function_creators | OFF?? | | sql_log_bin???????????????????? | ON??? | +---------------------------------+-------+ [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%slow_%';" +---------------------+-------------------------------+ | Variable_name?????? | Value???????????????????????? | +---------------------+-------------------------------+ | log_slow_queries??? | OFF?????????????????????????? | | slow_launch_time??? | 2???????????????????????????? | | slow_query_log????? | OFF?????????????????????????? | | slow_query_log_file | /data/3306/data/db02-slow.log | +---------------------+-------------------------------+ 索引緩沖區
[root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%key_buffer%';" +-----------------+----------+ | Variable_name?? | Value??? | +-----------------+----------+ | key_buffer_size | 16777216 | +-----------------+----------+
修改索引緩沖區的大小
set global key_buffer_size = 1024*1024*32; root@oldboy 11:03:59->show variables like '%key_buffer%'; +-----------------+----------+ | Variable_name?? | Value??? | +-----------------+----------+ | key_buffer_size | 33554432 | +-----------------+----------+ 1 row in set (0.00 sec) 不重啟數據庫更改數據庫參數小結: 1、set global key_buffer_size = 1024*1024*32; ?#<==及時生效,重啟mysql失效 2、配置文件也要改,編輯/etc/my.cnf,修改key_buffer_size = 32M 1.9 生產場景通常重要命令小結
show processlist; ?#查看數據庫正在執行的SQL語句,可能無法看全完整SQL語句 show full prcesslist #查看正在執行的完整SQL語句,完整顯示 set global key_buffer_size = 1024*1024*32 ?#不重啟數據庫調整數據庫參數,直接生效,重啟后失效、 show variables; ?#查看數據庫的配置參數信息,例如:my.cnf里參數的生效情況 kill ID???? #殺掉SQL線程的命令,ID為線程號 show session status ?#查看當前會話的數據庫狀態信息 show global status;? #查看整個數據庫運行狀態信息,很重要。要分析并做好監控 show status;??? #mysql運行狀態 show engine innodb status; #顯示InnoDB 引擎的性能狀態(早起版本show innodb status)
查看select進行的查看次數
root@oldboy 11:22:46->show global status like '%select%'; ? ? ? +------------------------+-------+ | Variable_name????????? | Value | +------------------------+-------+ | Com_insert_select????? | 0???? | | Com_replace_select???? | 0???? | | Com_select???????????? | 264?? |? ? ? ? ? ?? | Select_full_join?????? | 0???? | | Select_full_range_join | 0???? | | Select_range?????????? | 7???? | | Select_range_check???? | 0???? | | Select_scan??????????? | 287?? | +------------------------+-------+ 8 rows in set (0.00 sec) 查看查詢和寫入的次數
[root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show status ;"|grep -E "select|insert" Com_insert???? 0 Com_insert_select? 0 Com_replace_select?????? 0 Com_select???? 1 Delayed_insert_threads 0 Innodb_rows_inserted?? 117 Qcache_inserts????? 58 過濾出innodb引擎的參數
[root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show status ;"|grep -E "select|insert" Com_insert???? 0 Com_insert_select? 0 Com_replace_select?????? 0 Com_select???? 1 Delayed_insert_threads 0 Innodb_rows_inserted?? 117 Qcache_inserts????? 58 查看引擎innodb狀態
show gengine innodb status\G MySQL工具mysqlbinlog 2.1 mysql的binlog日志是什么? mysql數據目錄下的如下文件就是mysql的binlog日志
多實例路徑:/data/3306/ mysql-bin.00001 mysql-bin.00002 mysql-bin.00003 mysql-bin.00004 mysql-bin.00005 需要在配置文件中開啟次功能
grep log-bin my.cnf log-bin = /data/3306/mysql-bin 主要作用:用于數據庫的主從復制以及數據的增量恢復? ??
2.2 mysqlbinlog工具解析binlog日志實踐 默認情況binlog日志是二進制格式的,不能使用查看文本工具的命令來查看,例如:cat vi vim 2.3 解析指定庫的binlog日志 范例:利用mysqldump -d參數解析指定庫的binlog日志
shell>mysqlbinglog -d oldboy mysql-bin.00001 -r oldboy.sql 提示:-r代表>輸出內容 -d 指定庫文件 mysql-bin.000001內容介紹
# at 2154 #160630 ?7:45:07 server id 1 ?end_log_pos 2253 Query thread_id=11 exec_time=0 error_code=0 SET TIMESTAMP=1467243907/*!*/; create database qqqqqqq41233 /*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; 按照位置截取:確定 # at 2154 #160630 ?7:45:07 mysqlbinlog mysql-bin.000001 --start-position=2156 --stop-position=3000 -r pos.sql 其中,--start-posistion可以在配置文件中不存在,那時候取值將會取最接近2156的值 按照時間截圖:模糊,不準 mysqlbinlog mysql-bin.00001 --start-datetime='2016-10-16 17:14:15' --stop-datetime='2014-10-16 17:15:15' -r time.sql 指定開始時間,不指定結束時間,將從開始時間一直到最后 mysqlbinlog mysql-bin.000001 --start-datetime='2016-10-16 17:14:15' -r time.sql 指定結束時間,不指定開始時間,將從開始一直到指定的結束時間 mysqlbinlog mysql-bin.000002 --stop-datetime='2016-10-16 17:14:15' -r time.sql mysqlbinlog命令 1、把binlog解析為sql語句(包含位置和時間點) 2、-d參數genuine指定庫拆分binlog(拆分單表binlog可通過SQL關鍵字過濾) 3、通過位置參數獲取部分binlog: –start-position=301 –stop-position=305。精準定位取部分內容 4、通過時間參數截取部分binlog,–start-datetime=’2016-10-16 17:14:15′ –stop-datetime=’2016-10-16 17:17:17’,模糊取部分內容,會丟失數據。 5、-r 文件名,相當于”>文件名” 6、解析ROW級別binlog日志的方法。
mysqlbinlog --base64-ouput=decode-rows-v mysql-bin.00001 mysqlbinlog --base64-ouput="decode-rows" --verbose-mysql-bin.00001 2.3 錯誤日志(error log)介紹與調整 1.錯誤日志(error log)介紹 MySQL的錯誤日志(error log)記錄MySQL服務進程mysqld在啟動/關閉或運行過程中遇到的錯誤信息 2.錯誤日志(error log)實踐
法1:在配置文件中調整方法,當然可以在啟動時加入啟動參數 [mysqld_safe] log-error=/data/3306/mysql_oldboy3306.err 法2:啟動MySQL命令里加入: mysqld_safe --default-file=/data/3306/my.cnf --log-error=/data/3306/mysql_oldboy.err & root@oldboy 10:09:14->show variables like '%log_error%'; +---------------+---------------------------------+ | Variable_name | Value ? ? ? ? ? ? ? ? ? ? ? ? ? | +---------------+---------------------------------+ | log_error ? ? | /data/3306/mysql_oldboy3306.err | +---------------+---------------------------------+ 1 row in set (0.04 sec) 新裝MySQL服務,無法啟動排查思路 1.把/data/3306/data 目錄刪除后重新建立data目錄并加屬主屬組 2.把原有的my.cnf,mysql這兩個也重新還原過 3.重新用mysqld_safe啟動過 4.改過my.cnf里面server-id = 2 5.配置文件里面的端口,思路
步驟———————————- 1、先把日志文件備份并清空啟動一下mysql服務然后再查看日志文件報有什么錯誤?
[root@db02 3306]# cat mysql_oldboy3306.err 160616 16:46:07 mysqld_safe Starting mysqld daemon with databases from /data/3306/data 2、然后mysql3306目錄下面所有文件都加上屬主并是遞歸-R
[root@db02 3306]# chown -R mysql * 3、然后查看一下有沒有mysql 這個ID
[root@db02 3306]# id mysql uid=502(mysql) gid=502(mysql) groups=502(mysql) 4、重新啟動mysql服務(多實例)
[root@db02 3306]#/data/3306/mysql start 5、此時再查看一下服務有沒有啟動起來
[root@db02 3306]#lsof -i:3306 2.4 查詢日志(也可以叫做訪問日志) [root@db02 ~]grep gene /data/3306/my.cnf general_log = on general_log_file = /data/3306/data/MySQL_oldboy.log 會記錄mysql所有的操作 提示:高并發場景企業里普通查詢日志一般是關閉的(默認也是關閉)主要因為IO性能問題 2.5 慢查詢日志(slow query log )介紹與調整***** 1.慢查詢日志(slow query log)介紹 慢查詢日志(slow query log);記錄執行時間超出指定值(long_query_time)的SQL語句 2.慢查詢日志(slow query log)調整
long_query_time=超過指定時間查詢(看公司要求,通常2秒) log-slow-queries= 日志路徑 log_queries_not_using_indexes=不使用索引 慢查詢的設置,對于數據庫SQL的優化非常重要
[root@db02 oldboy]# egrep "quer" /data/3306/my.cnf|tail -3 long_query_time = 1 log-slow-queries = /data/3306/slow.log log_queries_not_using_indexes 2.6 慢查詢日志切割 shell>cat /server/scripts/cut_slow_log.sh cd /data/3306/ &&\ /bin/mv slow.log slow.log.$(date +%F)&&\ mysqladmin -uroot -poldboy123 -S /data/3306/mysql.sock flush-log shell>tail -2 /var/spool/cron/root #cut mysql slow log 00 00 * * * /bin/sh /server/scripts/cur_slow_log.sh >/dev/null 2>&1 使用explain優化SQL語句(select語句)的基礎流程; 1.抓慢查詢SQL語句方法: a. show full prcesslist;(登錄數據庫現場抓,連續執行2次,超過2秒) mysql -uroot -poldboy -S /data/3306/mysql.sock -e “show full processlist;”|egrep -vi “sleep” b.分析慢查詢日志
配置參數記錄慢查詢語句 2.explain語句檢查索引執行情況 大表不能高峰期建立索引,300萬條記錄
3.分析慢查詢的工具mysqlsla(每天早上發郵件) 切割慢查詢日志,去重分析后發給領導及相關部門 1)mv,reload進程。2)cp,>清空
shell>mv /data/3306/slow.log /opt/$(date +%F)_slow.log shell>mysqladmin -uroot -poldboy -S /data/3306/mysql.sock flush-logs mysqlsla分析:http://blog.itpub.net/7607759/viewspace-692828 2.7 二進制日志(binary log)介紹與調整 1、二進制日志(binary log)介紹 二進制日志(binary log)記錄數據表被修改的相關信息; 2.二進制日志(binary log)調整
root@oldboy 11:13:37->show variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name ? ? ? ? ? ? ? ? ? | Value | +---------------------------------+-------+ | log_bin ? ? ?記錄binlog開關 ? ? ?| ON ? ?| | log_bin_trust_function_creators | OFF ? | | sql_log_bin 臨時不記錄binlog開關(增量恢復)| ON? +---------------------------------+-------+ 3 rows in set (0.01 sec) 可以在配置文件中設置
[root@db02 3306]# grep log-bin /data/3306/my.cnf log-bin = /data/3306/mysql-bin 二進制日志log-bin作用; 1、以二進制形式記錄更改數據庫的SQL語句。 2、用于主從復制。 3、增量數據備份及恢復
臨時不記錄binlog(增量恢復) mysql>set session sql_log_bin = OFF mysql>show variables like ‘%log_bin%’;
2.8 增量備份 增量數據是從上次全量備份之后,更新的新數據。對于MySQL來說,binlog日志就是MySQL的增量數據
(1)按天全備情況 優點:恢復時間:短,維護成本:低 缺點:占用空間:多,占用系統資源多,經常鎖表影響用戶體驗。
(2)按周全備情況 優點:占用空間小,占用系統資源少,無需鎖表,用戶體驗好一些 缺點:維護成本高,恢復麻煩,時間長。
企業場景全量和增量的頻率是怎么做的呢? 1)中小公司,全量一般是每天一次,業務流量低谷執行全備,備份時會鎖表。 增量備: a.定時推binlog增量。例如每分鐘推一次增量 例:rsync -avz /data/3306/mysql-bin.0000* rsync_bakcup@10.0.0.1::backup –password-file=/etc/rsync.password b.再在其他遠程實時讀binlog。 -R, –read-from-remote-server? Read binary logs from a MySQL server. c. inotify 實時推送binlog d.mysql主從復制(實時復制功能) 2)大公司周備,每周六00點一次全量,周日-下周六00點前都是增量。 優點:節點備份時間,減少備份壓力。 單臺數據庫用rsync(配合定時任務頻率大或者inotify,主從復制)把所有binlog備份到遠程服務器,盡量做主從復制 缺點:增量的binlog文件副本太多,還原會很麻煩 3)一主多從環境,主從復制本身就是實時遠程備份,可以解決服務器物理故障。 4)一主多從環境,可采取一個從庫服務器上專門用mysqldump,cp、tar、xtrabackup做備份,延遲同步
MySQL備份常見方法 MySQL備份的常用方式有邏輯備份和物理備份(oracle也是如此) 邏輯備份:以SQL語句的形式對數據庫進行備份(mysqldump) 物理備份:直接備份磁盤上的數據信息(cp、tar、xtrabackup) 50G一下的數據選擇mysqldump,如果告訴50G 可以使用物理備份,因為那樣邏輯備份會比較慢。 物理備份好于邏輯備份 cp tar 停機(至少禁止寫入),xtrabackup支持熱備
MySQL的mysqldump備份什么時候排上用場? 1.遷移或者升級數據庫時。 2.增加從庫的時候。 3.因為硬件或特殊異常情況,主庫或從庫宕機,主從可以互相切換,無需備份 4.認為的DDL,DML語句,主從庫沒辦法了,所有庫都會執行。此時需要備份 5.跨機房災難,需要備份到異地
2.9 什么情況下需要增量恢復? 我們在生產工作中一般常用一主多從的數據庫架構,常見的備份方案是在某一個不對外服務的從庫上開啟binlog,然后實施定時全備和實時增量備份
什么是增量恢復? 利用二進制日志和全備進行恢復的過程,被稱為增量備份 1)主或者從庫宕機(硬件損壞)是否需要增量恢復? 答:不需要增量恢復,主庫宕機,只需要把其中一個同步最快的從庫切換為主庫即可。 主庫宕機,只要選擇更新最快的從庫(master.info,或者5.5半同步機制)提升為主庫 從庫宕機,直接不用就好了(一般都會陪LVS負載均衡)或者正常修復 結論:無論是主還是從,硬件損壞導致的故障無需恢復以及增量恢復。 2)人為操作數據庫SQL語句破壞主庫是否需要增量恢復? 在數據庫主庫內部命令行誤操作,會導致所有的數據庫(包括主從庫)數據丟失,例如:在主庫執行了drop database test;這樣的刪除語句,這時所有的從庫也會執行這個drop database test;語句,從而導致所有的數據庫上的oldboy數據丟失。這樣的場景是需要增量恢復的。 結論:認為操作數據庫SQL語句破壞主庫需要增量恢復 3)只有一個主庫是否需要增量恢復? 如果公司里只有一個主庫的情況,首先應該做定時全量備份(一天每天一次)及增量備份(每個1-10分鐘對binlog日志做切割然后備份到其他的服務器上,或者本地其他的硬盤里)或者寫到網絡文件系統(備份服務器)里。 如果不允許數據丟失,最好的辦法就是做從庫,通過drbd(基于磁盤塊的)同步
正常情況“ 主從同步:除了分擔讀寫分離壓力外,還可以防止物理設備損壞數據丟失的恢復。 從庫備份:在從庫進行全量和增量方式的備份,可以防止認為對主庫的誤操作導致數據丟失。 確保備份的從庫實時和主庫是同步狀態
小結:一般由認為(或程序)邏輯的方式在數據庫執行的SQL語句等誤操作,才需要增量恢復,因為此時所有的從庫夜之星了誤操作語句,物理故障,直接切換從庫即可,無需恢復 3.0 MySQL增量恢復必備條件 3.1 開啟MySQL log-bin 日志功能 Mysql數據庫開啟了log-bin 參數記錄binlog日志功能如下:
shell>grep log-bin /data/3306/my.cnf log-bin = /data/3306/mysql-bin 提示:主庫和備份的從庫都要開啟binlog記錄功能 小結:增量恢復的條件: 存在一份全備加上全備之后的時刻到出問題時刻的所有增量binlog文件備份
3.2 模擬每天00點備份數據,早上10.00領導刪除數據,10.10發現問題并進行解決 1.修改時間為00:00,進行全備
[root@db02 3306]#date -s "00:00:00"
[root@db02 3306]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B -F -R -x --master-data=2 oldboy|gzip >/opt/rh/oldboy-$(date +%F).sql.gz 2.備份完成修改成10點的時間
[root@db02 3306]#date -s "10:00:00" mysql>drop database test; 3.發現問題,并解決 備份后產生了mysql-bin-log,如果不知道可以采用別的方法進行查看 使用gzip查看備份的時候寫入那個binlog里面
[root@db02 rh]# gzip -d oldboy-2015-12-22.sql.gz [root@db02 rh]# grep CHANGE oldboy-2015-12-22.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=107; 4.導出數據進行備份,并進行分析
[root@db02 rh]# cp /data/3306/mysql-bin.000007 . [root@db02 rh]# ls -l total 8 -rw-r----- 1 root root? 792 Dec 22 10:10 mysql-bin.000007 -rw-r--r-- 1 root root 3010 Dec 22 00:00 oldboy-2015-12-22.sql 5.以及復制全量備份
[root@db02 rh]# mysqlbinlog -d oldboy oldboy-2015-12-22.sql 6.如果恢復的sql文件比較多可以使用模糊匹配 [root@db02 rh]# mysqlbinlog
-d oldboy oldboy-2015-12-22.sql*或者后面接上bin。? log的文件名(也可以使用for循環)
順序一定要正確 ? ??
[root@db02 rh]# mysqlbinlog -d oldboy mysql-bin.000007 >007.sql [root@db02 rh]#vim 007.sql 因為是使用drop刪除,日志里面記錄了,所以我們使用vim將里面的drop刪除 出了問題先把mysql-bin.log拿走,否則直接恢復數據庫會再次記錄
[root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock? <oldboy-2015-12-22.sql [root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;" +--------------------+ | Database?????????? | +--------------------+ | information_schema | | cyh??????????????? | | mysql????????????? | | oldboy???????????? | | oldboy123????????? | | oldboy_gbk???????? | | performance_schema | | wordpress????????? | +--------------------+ 表示已經恢復到我們00點之前的數據
[root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "select * from oldboy.test;" +----+--------+ | id | name?? | +----+--------+ |? 1 | gongli | |? 2 | gongli | |? 3 | gongli | |? 4 | gongli | |? 5 | gongli | +----+--------+ 恢復增量數據 恢復增量數據,最好指定數據庫名
[root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock ?007.sql
企業案例:
625某電商網站數據庫宕機故障解決實錄(上)???
http://oldboy.blog.51cto.com/2561410/1431161
http://oldboy.blog.51cto.com/2561410/1431172
總結
以上是生活随笔 為你收集整理的MySQL备份恢复与日志 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。