1、使用mysqlbinlog工具來恢復
Mysqlbinlog日志如何開啟?
在my.cnf這個文件中加一行。
#vi /etc/my.cnf
[mysqld]
log-bin=mysqlbin-log #添加這一行就可以了,=號後面自己定義日志文件名,默認該文件是存儲在datadir中。
mysqlbinlog用法詳細說明
服務器生成的二進制日志文件寫成二進制格式。要想檢查這些文本格式的文件,應使用mysqlbinlog實用工具。
#mysqlbinlog [options] log-files…
例如,要想顯示二進制日志mysql-bin.407的內容,使用下面的命令:
#mysqlbinlog mysql-bin.407
輸出包括在mysql-bin.407中包含的所有語句,以及其它信息例如每個語句花費的時間、客戶發出的線程ID、發出線程時的時間戳等等。
參數說明(mysql5以上版本參數添加了很多):
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數據類型。
–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選項設置下面的變量:
Variables (–variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
——————————— —————————–
base64-output (No default value)
character-sets-dir (No default value)
database (No default value)
debug-check FALSE
debug-info FALSE
disable-log-bin FALSE
force-if-open TRUE
force-read FALSE
hexdump FALSE
host (No default value)
local-load (No default value)
offset 0
port 3306
position 4
read-from-remote-server FALSE
server-id 0
set-charset (No default value)
short-form FALSE
socket /tmp/mysql.sock
start-datetime (No default value)
start-position 4
stop-datetime (No default value)
stop-position 18446744073709551615
to-last-log FALSE
user (No default value)
open_files_limit 64
例子:
查看日志
#mysqlbinlog mysql-bin.407
根據position從20-2000查找resource庫相關記錄,並輸出到指定文件:
#mysqlbinlog –start-position=”20″ –stop-position=”2000″ –database=resource mysql-bin.407 –result-file=result.sql
查找並導入數據庫:
#mysqlbinlog –start-position=”20″ –stop-position=”2000″ –database=resource mysql-bin.407 | mysql -u root
還可以根據時間來查找記錄:
#mysqlbinlog –start-datetime=”2012-09-20 8:10:00″ –stop-datetim=”2012-09-25 07:30:00″ mysql-bin.407 –result-file=result.sql
2、Mysqlbinlog導出並轉換編碼導入
原中文編碼為gb2312,轉換utf8編碼,並插入
(1)從position=387426452開始導出resource數據庫信息
#/usr/local/mysql/bin/mysqlbinlog –position=387426452 –set-charset=utf8 –database=resource mysql-bin.407 –result-file=result_resource.sql
(2)轉換編碼為utf8
#iconv -t utf-8 -f gb2312 -c result_resource.sql > new_result_resource.sql_utf8.sql
(3)導入數據庫
在mysql會話中需要set names utf8;
mysql> set names utf8;
mysql> source /tmp/new_result_resource.sql_utf8.sql