Fedora MySQL完整備份數(shù)據(jù)的恢復(fù)
Fedora MySQL對(duì)于電腦使用的玩家的常用軟件,然后我就學(xué)習(xí)及深入的研究Fedora MySQL,在這里和大家一起探討Fedora MySQL的使用方法,希望對(duì)大家有用。
一、實(shí)驗(yàn)環(huán)境
系統(tǒng)版本:Fedora 10 MySQL版本: Fedora MySQL 5.0
二、Fedora MySQL完整備份
如果你的數(shù)據(jù)庫(kù)允許停止服務(wù)并且需要備份數(shù)據(jù)量很大,你可以停止服務(wù)后直接復(fù)制數(shù)據(jù)庫(kù)對(duì)應(yīng)的文件:/var/lib/mysql/database 這樣的每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)于一個(gè)實(shí)際的目錄,直接復(fù)制備份即可。
如果你的Fedora MySQL服務(wù)器不允許停止服務(wù),那么我們可以使用Fedora MySQL的熱備份工具:Fedora MySQLldump,它的原理是把數(shù)據(jù)庫(kù)內(nèi)的內(nèi)容全部用sql語(yǔ)句進(jìn)行描述,這樣做的好處是我們導(dǎo)出來(lái)的這些sql語(yǔ)句只需簡(jiǎn)單的批量修改一些和別的數(shù)據(jù)庫(kù)不兼容的地方,就能把Mysql的數(shù)據(jù)導(dǎo)出到oracle等其它數(shù)據(jù)庫(kù)內(nèi)。
mysqldump -uroot -p test > /tmp/test.sql 這條語(yǔ)句導(dǎo)出了test表到test.sql文件中,我們來(lái)看下導(dǎo)出的主要內(nèi)容吧:
- -- Table structure for table `books`
- DROP TABLE IF EXISTS `books`;
- SET @saved_cs_client = @@character_set_client;
- SET character_set_client = utf8;
- CREATE TABLE `books` (
- `id` int(11) default NULL,
- `name` text,
- `publish` date default NULL,
- `author` text
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
- SET character_set_client = @saved_cs_client;
- -- Dumping data for table `books`
- LOCK TABLES `books` WRITE;
- INSERT INTO `books` VALUES (0,'Go to China','2002-10-21','Jim');
我們可以看到創(chuàng)建表和插入數(shù)據(jù)的sql語(yǔ)句。
三、Fedora MySQL數(shù)據(jù)的恢復(fù)
有了完整備份和二進(jìn)制日志,如果發(fā)生一些誤操作或數(shù)據(jù)庫(kù)當(dāng)機(jī),我們就能夠利用完全備份以及二進(jìn)制日志來(lái)把我們發(fā)生誤操作之前的內(nèi)容恢復(fù)出。舉例:我們?cè)谕暾麄浞莺?,?duì)數(shù)據(jù)庫(kù)有刪除和更新記錄等操作,隨后有人誤操作,把整個(gè)表全部清空,我們現(xiàn)在來(lái)恢復(fù)到清空前的狀態(tài)。首先,實(shí)驗(yàn)的前提是在打來(lái)了二進(jìn)制日志的情況下,去/etc/my.conf下,添加:log-bin=BinLog binlog-do-db=test
當(dāng)服務(wù)重新運(yùn)行起來(lái)之后,進(jìn)入Fedora MySQL
- mysql>show master status;
- +---------------------+---------------+--------------------+-------------------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +---------------------+---------------+--------------------+-------------------------------+
- | BinLog.000003 | 98 | test | |
- +---------------------+---------------+--------------------+-------------------------------+
提示我們test這個(gè)數(shù)據(jù)庫(kù)當(dāng)前在用BinLog.000003這個(gè)二進(jìn)制日志記錄。下面,我們開(kāi)始模擬一些操作:
- mysql> insert into books set
- -> id=2,
- -> name='Learn C++',
- -> publish='2003-01-12',
- -> author='jak'
- -> ;
- mysql> update books set author='Jerry' where id=0; delete from books;
誤操作以后,我們發(fā)現(xiàn)數(shù)據(jù)全部清空了,下面開(kāi)始回復(fù)。首先是恢復(fù)到完全備份:Fedora MySQLdump -uroot -p test < /tmp/test.sql 接下來(lái),我們用二進(jìn)制日志來(lái)恢復(fù)后來(lái)一直到清除表以前的操作:首先我們看下完全備份文件的時(shí)間戳:stat /tmp/test.sql | grep Change Change: 2009-05-22 21:56:42.000000000 +0800 可以看到,完全備份完成的時(shí)間是2009-05-22 21:56:42,我們使用這個(gè)時(shí)間作為二進(jìn)制日志回復(fù)的開(kāi)始時(shí)間。
接下來(lái),我們需要知道清空表的那個(gè)操作執(zhí)行的時(shí)間:mysqlbinlog /var/lib/mysql/BinLog.000003我們找到delete from books這條句子,查看時(shí)間。#090522 22:24:12 server id 1 end_log_pos 532 Query thread_id=3 exec_time=0 error_code=0 SET TIMESTAMP=1243002252/*!*/; delete from books
可見(jiàn)刪除發(fā)生的時(shí)間為090522 22:24:12這樣,我們就確定了開(kāi)始的時(shí)間和結(jié)束的時(shí)間,接下來(lái)開(kāi)始重新執(zhí)行完全備份到發(fā)生誤操作這段時(shí)間內(nèi)的這些操作。mysqlbinlog --start-date="2009-05-22 21:56:42" --stop-date="2009-05-22 22:24:12" /var/lib/mysql/BinLog.000003 | mysql -uroot -p執(zhí)行完后,我們?nèi)?shù)據(jù)庫(kù)內(nèi)可以驗(yàn)證一下。
由于二進(jìn)制日志對(duì)操作的時(shí)間記錄精確到秒,如果我們一秒內(nèi)發(fā)生多個(gè)操作就不能這樣了,我們可以用另外一個(gè)選項(xiàng)。mysqlbinlog --start-position=”****” --stop-position=”*****” /var/lib/mysql/BinLog.000003 | mysql -uroot以上的****表示對(duì)應(yīng)的操作在二進(jìn)制日志內(nèi)的POS數(shù)值,我們需要自己從日志中得到這個(gè)數(shù)據(jù)來(lái)確定,讀者可以嘗試之。
四、AB復(fù)制
Ab復(fù)制可以使兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器在運(yùn)行中保持某個(gè)庫(kù)或全部庫(kù)內(nèi)容的一致,其原理基于Fedora MySQL的二進(jìn)制日志會(huì)不斷的記錄對(duì)數(shù)據(jù)庫(kù)的所有操作,只要我們初期兩個(gè)數(shù)據(jù)庫(kù)內(nèi)容一致的話,讓主服務(wù)器打開(kāi)某個(gè)庫(kù)的二進(jìn)制日志、從數(shù)據(jù)庫(kù)在相同的庫(kù)內(nèi)容的基礎(chǔ)上接受主服務(wù)的日志并執(zhí)行相同的操作。主服務(wù)器IP:192.168.0.32 從服務(wù)器IP:192.168.0.21
1、首先我們需要打開(kāi)主服務(wù)器需要同步的庫(kù)的二進(jìn)制日志功能:修改/etc/my.conf
[mysqld]
server-id=1 //修改服務(wù)器ID log-bin=BinLog //二進(jìn)制日志文件名binlog-do-db=test //對(duì)test這個(gè)庫(kù)執(zhí)行二進(jìn)制日志操作接下來(lái)我們重啟主服務(wù)器,并且添加一個(gè)授權(quán)用戶讓從服務(wù)器獲取日志使用:
service mysqld restart;Fedora MySQL>grant replication slave,reload,super on test.* to slave@192.168.0.21 identified by 'slavepass'mysql>flush privileges #刷新授權(quán)表以上操作完成后我們從從服務(wù)器使用新賬戶登錄一下主服務(wù)器,檢驗(yàn)是否連接成功。mysql -uslave -pslavepass -h191.168.0.21
2、從服務(wù)器的設(shè)置稍復(fù)雜一些,首先是修改/etc/my.conf
增加這些內(nèi)容:
- [mysqld]
- server-id=2
- master-host=192.168.0.32
- master-user=slave
- master-password=slavepass
Fedora MySQL配置完成后,我們需要重啟服務(wù):
- service mysqld restart進(jìn)入從服務(wù)器的mysql客戶端,
- mysql>start slave;
- mysql>load data from master;
- mysql>show slave status"G; #顯示從服務(wù)器狀態(tài)
Fedora MySQL上面的命令的返回結(jié)果:
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.0.32 #主服務(wù)器IP地址
- Master_User: slave #用戶名
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: BinLog.000002 #讀取的主服務(wù)器的二進(jìn)制日志
- Read_Master_Log_Pos: 98 #讀取到的二進(jìn)制日志的位置
- Relay_Log_File: mysqld-relay-bin.000006
- Relay_Log_Pos: 232
- Relay_Master_Log_File: BinLog.000002
- Slave_IO_Running: Yes #IO是否已經(jīng)啟動(dòng)
- Slave_SQL_Running: Yes #SQL是否已經(jīng)啟動(dòng)
3、Fedora MySQL測(cè)試服務(wù)是否正常
我們看到以上的從Fedora MySQL服務(wù)器狀態(tài)后,可以在主服務(wù)器操作test這個(gè)庫(kù),增加表,插入數(shù)據(jù),刪除更新等操作都會(huì)在從服務(wù)器上全部復(fù)制出來(lái)。
【編輯推薦】