MYSQL資料的備份與恢複
1 SQL資料導入導出
實驗内容:
1.使用SQL語句将/etc/passwd檔案導入userdb庫userlist表,并給每條記錄添加自動編号。
2.将userdb庫userlist表中UID小于100的前10條記錄導出,存為/dbak/ulist.txt檔案。
實驗實作:
1.将/etc/passwd檔案導入MySQL資料庫
導入後的表結構取決于/etc/passwd配置檔案。若一時記不住各字段的含義,也可以檢視passwd配置檔案的man手冊頁,找到格式描述相關的說明,比如:
# man 5 passwd
.. ..
There is one entry per line, and each line has the format: account:password:UID:GID:GECOS:directory:shell //各字段的順序、大緻用途
1)建立userdb庫、userlist表
以資料庫使用者root登入MySQL服務:
# mysql -u root -p 123456
建立userdb庫,切換到userdb庫:
mysql> CREATE DATABASE userdb; Query OK, 1 row affected (0.04 sec) mysql> USE userdb; Database changed
mysql> CREATE DATABASE userdb;
Query OK, 1 row affected (0.04 sec)
mysql> USE userdb;
Database changed
建立userlist表,字段設定及相關操作參考如下:
mysql> CREATE TABLE userlist( -> username varchar(24) NOT NULL,
-> password varchar(48) DEFAULT 'x',
-> uid int(5) NOT NULL,
-> gid int(5) NOT NULL,
-> fullname varchar(48),
-> homedir varchar(64) NOT NULL,
-> shell varchar(24) NOT NULL
-> );
Query OK, 0 rows affected (0.17 sec)
mysql> DESC userlist; //确認userlist表的結構:
2)執行導入操作
讀取/etc/passwd檔案内容,以“:”為分隔,導入到userlist表中:
mysql>load data infile "/etc/passwd" //執行導入表中
→into table userlist
→fields terminated by ":"
→lines terminated by "\n";
query ok
3)确認導入結果
分别統計userlist、userlist2表内的記錄個數:
mysql> SELECT COUNT(*) FROM userlist;
mysql> SELECT COUNT(*) FROM userlist2;
2.為userlist表中的每條記錄添加自動編号
這個隻要修改userlist表結構,添加一個自增字段即可。
比如,添加一個名為sn的序号列,作為userlist表的第一個字段:
1)添加自增主鍵字段sn
mysql> ALTER TABLE userlist -> ADD sn int(4) AUTO_INCREMENT PRIMARY KEY FIRST;
2)驗證自動編号結果
檢視userlist表的前10條記錄,列出序号、使用者名、UID、GID、宿主目錄:
mysql> SELECT sn,username,uid,gid,homedir -> FROM userlist LIMIT 10;
3.從MySQL資料庫中導出查詢結果
以将userdb庫userlist表中UID小于100的前10條記錄導出為/dbak/ulist.txt檔案為例,首先要確定目标檔案夾存在,且msyql使用者有權限寫入(否則導出會失敗)。
1)确認存放導出資料的檔案夾
# mkdir /dbbak //若沒有此檔案夾,可建立
# chown mysql /dbbak //確定mysql有權限寫入
# ls -ld /dbbak/ //确認權限 drwxr-xr-x.
mysql root 4096 1月 10 17:46 /dbbak/
)導出userlsit表中UID小于100的前10條記錄
如果以預設的'\n' 為行分隔,導出操作同樣可不指定LINES TERMINATED BY:
mysql> SELECT * FROM userdb.userlist WHERE uid<100 //執行導出操作
-> INTO OUTFILE '/dbbak/ulist.txt'
-> FIELDS TERMINATED BY ':';
Query OK, 26 rows affected (0.08 sec)
3)确認導出結果
傳回到Shell指令行,檢視/dbbak/ulist.txt檔案的行數:
# wc -l /dbbak/ulist.txt
4)驗證兩種會導出失敗的情況
目标檔案夾不存在時:
mysql> SELECT * FROM userdb.userlist
-> INTO OUTFILE '/databackup/ulist.txt'
-> FIELDS TERMINATED BY ':';
ERROR 1 (HY000): Can't create/write to file '/databackup/ulist.txt' (Errcode: 2 - No such file or directory)
目标檔案夾存在,但是mysql沒有寫入權限時:
-> INTO OUTFILE '/opt/ulist.txt'
ERROR 1 (HY000): Can't create/write to file '/opt/ulist.txt' (Errcode: 13 - Permission denied)
解決辦法:1修改目錄的權限 ,加入mysql組或者other+w權限
2 關閉selinux ,改為disabled
2、mysql備份與恢複
1.使用mysqldump進行邏輯備份(完全備份)
1)備份MySQL伺服器上的所有庫,将所有的庫備份為mysql-alldb.sql檔案:
#mysqldump -u root -p --all-databases>/root/mysql-alldb.sql
//備份所有庫
Enter password: //驗證密碼
# file /root/alldb.sql //确認備份檔案類型 /root/alldb.sql: UTF-8 Unicode English text, with very long lines
***特别提示:若資料庫都使用MyISAM存儲引擎,可以采用冷備份的方式,直接複制對應數 據庫目錄即可;恢複時重新複制回來就行。
2)隻備份指定的某一個庫
将userdb庫備份為userdb.sql檔案:
#mysqldump -uroot -p userdb>userdb.sql//備份指定庫
3)同時備份指定的多個庫
同時備份mysql、test、userdb庫,儲存為mysql+test+userdb.sql檔案:
#mysqldump -uroot -p -B mysql test userdb>mysql+test+userdb.sql
//備份多個庫
4)備份指定庫下的指定表
#mysqldump -uroot -p mysql test>mysql_test.sql //備份mysql庫下的test表
2.使用mysql指令從備份中恢複資料庫、表
以恢複userdb庫為例,可參考下列操作。通常不建議直接覆寫舊庫,而是采用建立新庫并導入邏輯備份的方式執行恢複,待新庫正常後即可廢棄或删除舊庫。
1)建立名為userdb2的新庫:
mysql> CREATE DATABASE userdb2;//建立新表
Query OK, 1 row affected (0.00 sec)
2)導入備份檔案,在新庫中重建表及資料:
#mysqldump -uroot -p userdb2</root/userdb.sql
3)确認新庫正常,啟用新庫:
mysql> USE userdb2; //切換到新庫
mysql> SELECT sn,username,uid,gid,homedir //查詢資料,确認可用
4)廢棄或删除舊庫:
mysql> DROP DATABASE userdb;//确認新庫可用後删除舊庫
Query OK, 2 rows affected (0.09 sec)
3 使用binlog日志
1、啟用binlog日志
1)調整/etc/my.cnf配置,并重新開機服務
# vim /etc/my.cnf //修改my.cnf配置檔案
[mysqld]
log-bin=mysql-bin //啟用二進制日志,并指定字首
(這裡可以指定存放的路徑,但是要確定目錄有被mysql使用者寫入的權限,可以更改目錄的所有者)
# service mysql restart
Shutting down MySQL.. [确定]
Starting MySQL.. [确定]
2)确認binlog日志檔案
新啟用binlog後,每次啟動MySQl服務都會新生成一份日志檔案:
# ls /var/lib/mysql/mysql-bin.* //确認binlog啟用
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.index
重新開機MySQL服務程式,或者執行SQL操作“FLUSH LOGS;”,會生成一份新的日志:
# ls /var/lib/mysql/mysql-bin.*
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.index /var/lib/mysql/mysql-bin.000002
//最後一個是剛剛生成的檔案
心得總結:使用mysql指令從備份中恢複資料庫、表時通常不建議直接覆寫舊庫,而是采用
建立新庫并導入邏輯備份的方式執行恢複,待新庫正常後即可廢棄或删除舊庫。
2.利用binlog日志重做資料庫操作
1)執行資料庫表添加操作
建立db1·庫tb1表,表結構自定義:
mysql> CREATE DATABASE db1;//建立新庫
Query OK, 1 row affected (0.05 sec)
mysql> USE db1;
mysql> CREATE TABLE tb1(//建立新表
-> id int(4) NOT NULL,name varchar(24)
Query OK, 0 rows affected (0.19 sec)
mysql> IN SERT INTO tb1 VALUES
-> (1,'Jack'),//插入3條表記錄
-> (2,'Kenthy'),
-> (3,'Bob');
Query OK, 3 rows affected (0.13 sec)
Records: 3 Duplicates: 0 Warnings: 0
确認插入的表記錄資料:
mysql> SELECT * FROM tb1;
+----+--------+
| id | name |
| 1 | Jack |
| 2 | Kenthy |
| 3 | Bob |
3 rows in set (0.04 sec)
2)删除前一步添加的3條表記錄
執行删除所有表記錄操作:
mysql> DELETE FROM tb1; Query OK, 3 rows affected (0.00 sec)
mysql> DELETE FROM tb1;
Query OK, 3 rows affected (0.00 sec)
确認删除結果:
Empty set (0.00 sec)
3)通過binlog日志恢複表記錄
binlog會記錄所有的資料庫、表更改操作,是以可在必要的時候重新執行以前做過的一
部分資料操作,但對于啟用binlog之前已經存在的庫、表資料将不适用。
根據上述“恢複被删除的3條表記錄”的需求,應通過mysqlbinlog工具檢視相關日志檔案
,找到删除這些表記錄的時間點,隻要恢複此前的SQL操作(主要是插入那3條記錄的操作)即可。
# mysqlbinlog /var/lib/mysql/mysql-bin.000002
... ...
# at 415
#140112 20:12:14 server id 1 end_log_pos 545 CRC32 0x98781640 Query thread_id=1 exec_time=0 error_code=0 //插入表記錄的起始時間點
SET TIMESTAMP=1389528734/*!*/;
INSERT INTO tb1 VALUES
(1,'Jack'),
(2,'Kenthy'),
(3,'Bob')
/*!*/;
#140112 20:12:14 server id 1 end_log_pos 576 CRC32 0x672e96e5 Xid = 9 //确認事務的時間點
#140112 20:13:51 server id 1 end_log_pos 740 CRC32 0x253837bb Query thread_id=1 exec_time=0 error_code=0 //删除表記錄的時間點
根據上述日志分析,隻要恢複從2014.01.12 20:12:14到2014.01.12 20:13:50之間的操作即可。可通過mysqlbinlog指定時間範圍輸出,結合管道交給msyql指令執行導入重做:
# mysqlbinlog --start-datetime="2014-01-12 20:12:14" \
--stop-datetime="2014-01-12 20:12:50" \ //按時間點恢複資料
/var/lib/mysql/mysql-bin.000002 | mysql -u root
-p Enter password: //驗證密碼
4)确認恢複結果
mysql> SELECT * FROM db1.tb1;
3 rows in set (0.00 sec)
本文轉自Jx戰壕 51CTO部落格,原文連結:http://blog.51cto.com/xujpxm/1386296,如需轉載請自行聯系原作者