Chinaunix首页 | 论坛 | 博客
  • 博客访问: 647465
  • 博文数量: 137
  • 博客积分: 6189
  • 博客等级: 准将
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-15 16:39
文章分类

全部博文(137)

文章存档

2010年(3)

2009年(1)

2008年(49)

2007年(56)

2006年(28)

分类: LINUX

2008-05-16 12:08:11

當然,系統剛弄好是沒有開啟 mysqlbinlog 的功能,至少在 CentOS4.4 上面我還要去開啟,不過 ubuntu 系統預設就已經開啟了,不過沒關係,只要利用下面方法就可以達到了

修改 my.cnf [ CentOS: /etc/my.cnf Ubuntu: /etc/mysql/my.cnf ],加入下面語法

# Replication Master Server (default)
# binary logging is required for replication
log-BIN=mysql-BIN

不過話說當你開啟這個功能之後,你會發現在 /var/lib/mysql/ 底下多出很多檔案

-rw-rw----   1 mysql mysql  33164904  117 15:44 mysql-bin.000001
-rw-rw----   1 mysql mysql      4007  117 15:50 mysql-bin.000002
-rw-rw----   1 mysql mysql  70288989  129 22:38 mysql-bin.000003
-rw-rw----   1 mysql mysql     16665  129 22:41 mysql-bin.000004
-rw-rw----   1 mysql mysql      4792  129 22:42 mysql-bin.000005
-rw-rw----   1 mysql mysql  56274069  210 06:25 mysql-bin.000006
-rw-rw----   1 mysql mysql 893963240  329 09:21 mysql-bin.000007
-rw-rw----   1 mysql mysql 666605284  329 09:39 mysql-bin.000008
-rw-rw----   1 mysql mysql    151946  329 10:02 mysql-bin.000009
-rw-rw----   1 mysql mysql   3450785  329 22:38 mysql-bin.000010

上面就是產生 mysqlbinlog 檔案,當然如果你要觀看那一個檔案下指令吧

shell> mysqlbinlog binlog.0000003

裏面的語法包跨 每個語句花費的時間、客戶發出的線程ID、發出線程時的時間戳,也可以遠端觀看

當讀取遠程二進制日誌時,可以通過連接參數選項來指示如何連接伺服器,但它們經常被忽略掉,除非您還指定了–read-from-remote-server選項。這些選項是–host、–password、–port、–protocol、–socket和–user。

底下來說明一下用法~

1. 指定恢復時間語法

假如你今天早上9點不小心砍掉哪個資料庫的資料表,你可以利用下面語法來恢復

mysqlbinlog --stop-date="2007-03-29 8:59:59"  /var/lib/mysql/bin.000001 | mysql -u root -p

如果你想恢復後面9點以後sql語法 可以使用

mysqlbinlog --start-date="2007-03-29 9:00:00"  /var/lib/mysql/bin.000001 | mysql -u root -p

或者是 你想恢復 9點到10點之間的sql語法,則下面語法是您想要的

mysqlbinlog --start-date="2007-03-29 9:00:00"  --stop-date="2007-03-29 10:00:00".000001 | mysql -u root -p /var/lib/mysql/bin

其實你也可以不要執行,先把sql語法輸出到 /tmp/restore.sql

mysqlbinlog --start-date="2007-03-29 9:00:00"  --stop-date="2007-03-29 10:00:00".000001 > /tmp/restore.sql /var/lib/mysql/bin

當然 你也可以指定你要輸出的 database,免的檔案很大

--database=db_name,-d db_name
--host=host_name,-h host_name



在MySQL中binlog的作用和Oracle中的归档日志类似, Oracle中提供了DBMS_LOGMNR来对日志文件进行分析, 来解出Redo SQL和Undo SQL, MySQL中也提供了一个名为mysqlbinlog的工具, 用来解释或取出存放在binlog中的SQL语句, 有没有Undo SQL我到是没有研究过. 最基本的使用语法如下:
mysqlbinlog [options] log_file ...

    在选项中, 可以指定一些过滤条件, 来解出你所想用的东西, 这样的选项有:

--database=db_name, -d db_name
--offset=N, -o N
--[start|stop]-datetime=datetime
--[start|stop]-position=N

    解出来的就是一条一条SQL语句了, 将这些语句执行一下, 就等于增量恢复了, 估计不是用绑定变量的, 可能在MySQL中是不是绑定变量不是很重要了. 当然重要的一点是不要运行多个进程去跑, 因为这样的话, 顺序就得不到保证了. 如下所示:

$ mysqlbinlog binlog.000001 >  /tmp/statements.sql
$ mysqlbinlog binlog.000002 >> /tmp/statements.sql
$ mysql -e "source /tmp/statements.sql"

    Oracle的LogMiner不太爽是因为他不是离线的, 做成MySQL这样的倒是比较方便多了. 看到这儿也应当可以想象到, MySQL中的复制大约是什么回事了吧?


阅读(1057) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~