shell腳本批量導出MYSQL數據庫日誌/按照最近N天的形式導出二進制日誌[連載之構建百萬訪問量電子商務網站]

shell腳本批量導出MYSQL數據庫日誌/自動本地導出MYSQL二進制日誌,按天備份[連載之構建百萬訪問量電子商務網站]
出處:http://jimmyli.blog.51cto.com/ 我站在巨人肩膀上Jimmy Li
作者:Jimmy Li
關鍵詞:網站,電子商務,Shell,自動備份,異地備份
------[連載之電子商務系統架構]訪問量超過100萬的電子商務網站技術架構
連接:
http://jimmyli.blog.51cto.com/3190309/676378 訪問量超過100萬的電子商務網站技術架構
 
mysqlbinlog
從二進制日誌讀取語句的工具。在二進制日誌文件中包含的執行過的語句的日誌可用來幫助從崩潰中恢復。
 
一、MYSQL數據庫日誌,有以下幾種日誌:
1.錯誤日誌: -log-error
2.查詢日誌: -log
3.慢查詢日誌: -log-slow-queries
4.更新日誌: -log-update
5.二進制日誌: -log-bin
這裏討論的是MYSQL二進制日誌的導出、導入;MYSQL二進制日誌完整備份,增量備份。
默認情況下,所有日誌創建於mysqld數據目錄中,或者手工指定/etc/my.cnf [mysqld] 設置段的選項設置。
在linux下:
# 在[mysqld] 中輸入
Python
  1. [mysqld]
  2. log_long_format
  3. log-bin = /data/mysql/3306/binlog
  4. binlog_cache_size = 4M
  5. binlog_format = MIXED
  6. max_binlog_cache_size = 16M
  7. max_binlog_size = 512M
  8. expire_logs_days = 30
  9.  

 
以上,開啓MYSQL的二進制日誌,並指定保存日誌的路徑。
 
binlog日誌打開方法
在my.cnf這個文件中加一行(Windows爲my.ini)。

[mysqld]
log-bin=mysqlbin-log #添加這一行就ok了=號後面的名字自己定義吧
然後我們可以對數據庫做簡單的操作後到mysql數據文件所在的目錄來看binlog文件

[root@jimmyli mysql]# ll
-rw-rw---- 1 mysql mysql 813255 Nov 25 18:14 mysqlbin-log.000001
看到這個類似的文件,證明搞定了。

二、查看二進制日誌文件用mysqlbinlog命令
是否啓用了日誌
mysql>show variables like 'log_%';
怎樣知道當前的日誌
mysql> show master status;
顯示二進制日誌數目
mysql> show master logs;
看二進制日誌文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail 9000
查看二進制日誌文件最後(倒數)9000行的SQL日誌記錄

三、shell腳本批量導出MYSQL數據庫日誌
按照最近N天的形式導出二進制日誌
上面的設置中,MYSQL二進制日誌保存了30天,mail-bin.000001類似文件保存的大小爲512M。根據網站的運營需要,需要將MYSQL二進制日誌完整備份,增量備份,按照最近N天的形式導出日誌文件,以TXT文件保存。
shell
  1. shell代碼如下:
  2. #!/bin/bash
  3. iday=60 #循環導出60天的mysqlbinlog日誌
  4. startday=$(date -d "-$iday day" +"%y-%m-%d")
  5. stopday=$(date +"%y-%m-%d")
  6. # while [ "$startday" != "$stopday" ]
  7. while [ $iday -ge 1 ]
  8. #while (("$iday" >= 1))
  9. do
  10. echo $iday
  11. startday=$(date -d "-$iday day" +"%y-%m-%d")
  12. echo startday=$startday
  13. echo stopday=$stopday
  14. ./mysqlbinlog --start-datetime="$startday 00:00:00" --stop-datetim="$startday 23:59:59" binlog.*[0-9] > $startday.txt
  15. echo ---------------
  16. iday=`expr $iday - 1`
  17. done
  18. 執行結果如下
  19. [root@JimmyLi bin]# ./test.sh
  20. 60
  21. startday=12-04-17
  22. stopday=12-06-16
  23. ---------------
  24. #中間忽略#
  25. 1
  26. startday=12-06-15
  27. stopday=12-06-16
  28. ---------------
  29.  

 
 
從12-04-17.txt到12-06-15.txt共60天的日誌,以天爲單位,每一個日期生成當天的mysqlbinlog日誌。

四、自動本地導出MYSQL二進制日誌,按天備份
 
可以將mysqlbinlog的輸出傳到mysql客戶端以執行包含在二進制日誌中的語句。如果你有一箇舊的備份,該選項在崩潰恢復時也很有用:
shell> mysqlbinlog hostname-bin.000001 | mysql
或:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
shell> mysqlbinlog hostname-bin.*[0-9] > bin.txt
如果你需要先修改含語句的日誌,還可以將mysqlbinlog的輸出重新指向一個文本文件。
(例如,想刪除由於某種原因而不想執行的語句)。編輯好文件後,將它輸入到mysql程序並執行它包含的語句。
自動本地導出MYSQL二進制日誌,按天備份命令:
shell>./mysqlbinlog --start-datetime="12-06-16 00:00:00" --stop-datetim="12-06-16 23:59:59" binlog.*[0-9] > 12-06-16.txt

五、討論如果MySQL服務器上有多個要執行的二進制日誌,安全的處理方法。
mysqlbinlog有一個--position選項,只打印那些在二進制日誌中的偏移量大於或等於某個給定位置的語句(給出的位置必須匹配一個事件的開始)。
它還有在看見給定日期和時間的事件後停止或啓動的選項。這樣可以使用--stop-datetime選項進行點對點恢復(例如,能夠說“將數據庫前滾動到今天10:30 AM的位置”)。

如果MySQL服務器上有多個要執行的二進制日誌,安全的方法是在一個連接中處理它們。下面是一個說明什麼是不安全的例子:
shell> mysqlbinlog hostname-bin.000001 | mysql -u root
shell> mysqlbinlog hostname-bin.000002 | mysql -u root
使用與服務器的不同連接來處理二進制日誌時,如果第1個日誌文件包含一個CREATE TEMPORARY TABLE語句,第2個日誌包含一個使用該臨時表的語句,則會造成問題。當第1個mysql進程結束時,服務器撤銷臨時表。當第2個mysql進程想使用該表時,服務器報告 “不知道該表”。
要想避免此類問題,使用一個連接來執行想要處理的所有二進制日誌中的內容。下面提供了一種方法:
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
另一個方法是:
shell> mysqlbinlog hostname-bin.000001 >  /tmp/statements.sql
shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql
shell> mysql -e "source /tmp/statements.sql"
mysqlbinlog產生的輸出可以不需要原數據文件即可重新生成一個LOAD DATA INFILE操作。mysqlbinlog將數據複製到一個臨時文件並寫一個引用該文件的LOAD DATA LOCAL INFILE語句。由系統確定寫入這些文件的目錄的默認位置。要想顯式指定一個目錄,使用--local-load選項。
因爲mysqlbinlog可以將LOAD DATA INFILE語句轉換爲LOAD DATA LOCAL INFILE語句(也就是說,它添加了LOCAL),用於處理語句的客戶端和服務器必須配置爲允許LOCAL操作。
警告:爲LOAD DATA LOCAL語句創建的臨時文件不會自動刪除,因爲在實際執行完那些語句前需要它們。不再需要語句日誌後應自己刪除臨時文件。文件位於臨時文件目錄中,文件名類似original_file_name-#-#。

六、其他查看MYSQL日誌的相關命令
1. 查看自己的BINLOG的名字是什麼
命令:show binary logs;
mysql> show binary logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000044 | 471894871 |
| binlog.000045 |    267061 |
+---------------+-----------+
2 rows in set (0.00 sec)
以後每次對錶的相關操作時候,這個File_size都會增大。

2. 做了幾次操作後,它就記錄了下來。
命令:show binlog events

3. 用mysqlbinlog 工具來顯示記錄的二進制結果,然後導入到文本文件,爲了以後的恢復。
詳細過程如下:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-position=4 --sto
p-position=106 mysqlbin-log.000001 > c:\\test1.txt
或者全部導出:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog mysqlbin-log.000001 > c:\\test1.txt

4. 導入結果到MYSQL中進行數據恢復。
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-position=134 --stop-position=330 mysqlbin-log.000001 | mysql -uroot -p
或者
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-position=134 --stop-position=330 mysqlbin-log.000001 >test1.txt
進入MYSQL導入
mysql> source c:\\test1.txt
還有一種辦法是根據日期來恢復
C:\Program Files\MySQL\MySQL Server 5.0\bin >mysqlbinlog --start-datetime="2009-09-14 0:20:00" --stop-datetim="2009-09-15 01:25:00" /diskb/bin-logs/xxx_db-bin.000001 | mysql -u root
5、查看數據
Select * from User
6、其他MYSQL日誌命令
是否啓用了日誌
mysql>show variables like 'log_%';
怎樣知道當前的日誌
mysql> show master status;
顯示二進制日誌數目
mysql> show master logs;
看二進制日誌文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail 9000
查看二進制日誌文件最後(倒數)9000行的SQL日誌記錄

附錄:
mysqlbinlog用法詳細說明
服務器生成的二進制日誌文件寫成二進制格式。要想檢查這些文本格式的文件,應使用mysqlbinlog實用工具。
應這樣調用mysqlbinlog:
shell> mysqlbinlog [options] log-files...例如,要想顯示二進制日誌binlog.000003的內容,使用下面的命令:
shell> mysqlbinlog binlog.0000003輸出包括在binlog.000003中包含的所有語句,以及其它信息例如每個語句花費的時間、客戶發出的線程ID、發出線程時的時間戳等等。
通常情況,可以使用mysqlbinlog直接讀取二進制日誌文件並將它們用於本地MySQL服務器。也可以使用--read-from-remote-server選項從遠程服務器讀取二進制日誌。
當讀取遠程二進制日誌時,可以通過連接參數選項來指示如何連接服務器,但它們經常被忽略掉,除非你還指定了--read-from-remote-server選項。這些選項是--host、--password、--port、--protocol、--socket和--user。
還可以使用mysqlbinlog來讀取在複製過程中從服務器所寫的中繼日誌文件。中繼日誌格式與二進制日誌文件相同。
mysqlbinlog支持下面的選項:
·
---help,-?
顯示幫助消息並退出。
·
---database=db_name,-d db_name
只列出該數據庫的條目(只用本地日誌)。
·
--force-read,-f
使用該選項,如果mysqlbinlog讀它不能識別的二進制日誌事件,它會打印警告,忽略該事件並繼續。沒有該選項,如果mysqlbinlog讀到此類事件則停止。
·
--hexdump,-H
在註釋中顯示日誌的十六進制轉儲。該輸出可以幫助複製過程中的調試。在MySQL 5.1.2中添加了該選項。
·
--host=host_name,-h host_name
獲取給定主機上的MySQL服務器的二進制日誌。
·
--local-load=path,-l pat
爲指定目錄中的LOAD DATA INFILE預處理本地臨時文件。
·
--offset=N,-o N
跳過前N個條目。
·
--password[=password],-p[password]
當連接服務器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間不能有空格。如果在命令行中--password或-p選項後面沒有 密碼值,則提示輸入一個密碼。
·
--port=port_num,-P port_num
用於連接遠程服務器的TCP/IP端口號。
·
--position=N,-j N
不贊成使用,應使用--start-position。
·
--protocol={TCP | SOCKET | PIPE | -position
使用的連接協議。
·
--read-from-remote-server,-R
從MySQL服務器讀二進制日誌。如果未給出該選項,任何連接參數選項將被忽略。這些選項是--host、--password、--port、--protocol、--socket和--user。
·
--result-file=name, -r name
將輸出指向給定的文件。
·
--short-form,-s
只顯示日誌中包含的語句,不顯示其它信息。
·
--socket=path,-S path
用於連接的套接字文件。
·
--start-datetime=datetime
從二進制日誌中第1個日期時間等於或晚於datetime參量的事件開始讀取。datetime值相對於運行mysqlbinlog的機器上的本地時區。該值格式應符合DATETIME或TIMESTAMP數據類型。例如:
shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003該選項可以幫助點對點恢復。
·
--stop-datetime=datetime
從二進制日誌中第1個日期時間等於或晚於datetime參量的事件起停止讀。關於datetime值的描述參見--start-datetime選項。該選項可以幫助及時恢復。
·
--start-position=N
從二進制日誌中第1個位置等於N參量時的事件開始讀。
·
--stop-position=N
從二進制日誌中第1個位置等於和大於N參量時的事件起停止讀。
·
--to-last-logs,-t
在MySQL服務器中請求的二進制日誌的結尾處不停止,而是繼續打印直到最後一個二進制日誌的結尾。如果將輸出發送給同一臺MySQL服務器,會導致無限循環。該選項要求--read-from-remote-server。
·
--disable-logs-bin,-D
禁用二進制日誌。如果使用--to-last-logs選項將輸出發送給同一臺MySQL服務器,可以避免無限循環。該選項在崩潰恢復時也很有用,可以避免複製已經記錄的語句。註釋:該選項要求有SUPER權限。
·
--user=user_name,-u user_name
連接遠程服務器時使用的MySQL用戶名。
·
--version,-V
顯示版本信息並退出。
還可以使用--var_name=value選項設置下面的變量:
·
open_files_limit
指定要保留的打開的文件描述符的數量。
·
--hexdump選項可以在註釋中產生日誌內容的十六進制轉儲:
shell> mysqlbinlog --hexdump master-bin.000001上述命令的輸出應類似十六進制轉儲:

出處:http://jimmyli.blog.51cto.com/ Jimmy Li Blog 。歡迎朋友一起交流,討論。扣扣:柒⑥柒陸叄⑤叄伍
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章