mysql数据库备份总结_MySQL数据库备份总结
一個(gè)企業(yè)的正常運(yùn)行,數(shù)據(jù)的完整性是最關(guān)鍵的;所以我們需要在工作中要很熟練的掌握數(shù)據(jù)的備份與恢復(fù)方法;下面是對(duì)Mysql數(shù)據(jù)庫(kù)備份的三種方法總結(jié),希望對(duì)大家會(huì)有所幫助
備份開(kāi)始前的工作環(huán)境準(zhǔn)備:
1、創(chuàng)建用于保存二進(jìn)制日志文件的目錄
#?mkdir?/mybinlog
#?chown?mysql.mysql?/mybinlog
2、修改配置文件
#?vim?/etc/my.cnf
log-bin=/mybinlog/mysql-bin???二進(jìn)制日志目錄及文件前綴
innodb_file_per_table=1啟用innoDB表
datadir=?/mydata/data????指定數(shù)據(jù)庫(kù)的目錄
3、為備份數(shù)據(jù)庫(kù)創(chuàng)建存放點(diǎn)
#?mkdir?/mybackup
#?chown?-R?mysql.mysql?/mybackup
4、啟動(dòng)mysql服務(wù)器
#?service?mysqld?start
5、插入需要備份的數(shù)據(jù)庫(kù)
#?mysql
一、使用mysqldump工具完成完全備份+增量備份基于mysqldump通常就是完整備份+二進(jìn)制日志來(lái)進(jìn)行恢復(fù)數(shù)據(jù)
1.1、mysqldump用來(lái)溫備份,首先需要為所有庫(kù)加讀鎖,并且滾動(dòng)一下二進(jìn)制日志,記錄當(dāng)前二進(jìn)制文件位置
#?mysqldump?--all-databases?--lock-all-tables?--routines?--triggers--master-data=2
--flush-logs>/mybackup/alldatabase.sql
解釋各個(gè)選項(xiàng)的意義:
--all-databases?備份所有數(shù)據(jù)庫(kù)
--lock-all-tables?為所有表加鎖
--routines?存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)
--triggers?觸發(fā)器
--master-data=2以change?master?to的方式記錄位置,但默認(rèn)為被注釋
--flush-logs??執(zhí)行日志滾動(dòng)
1.2、備份二進(jìn)制日志
#?cp?/mybinlog/mysql-bin.000001?/mybackup/alldatabase.000001
1.3、模擬數(shù)據(jù)庫(kù)意外損壞,利用完全備份實(shí)現(xiàn)數(shù)據(jù)庫(kù)的恢復(fù)
#?rm?-rf?/mydata/data/*
#?rm?-rf?/mybinlog/*
1.4、初始化mysql并啟動(dòng)服務(wù)器
#?cd?/usr/local/mysql/
#?./scripts/mysql_install_db?--user=mysql--datadir=/mydata/data
1.5、刪除二進(jìn)制日志,啟動(dòng)服務(wù)
#?rm?-rf?/mybinlog/*
#?netstat?-tnlp?查看啟動(dòng)的mysql進(jìn)程號(hào)
tcp????????0??????0?0.0.0.0:3306???????????0.0.0.0:*???????????LISTEN??????2523/mysql
#?kill?2523??(注意,如果在備份之前mysql服務(wù)是開(kāi)啟的,重啟是不成功的,需要把這個(gè)進(jìn)程先kill掉)
#?service?mysqld?restart
1.6、恢復(fù)到備份狀態(tài),導(dǎo)入備份的數(shù)據(jù)庫(kù)文件:
#?mysql
2、模擬往students表中添加數(shù)據(jù),添加完成后不小心將表刪除了,我們要恢復(fù)到刪除之前的狀態(tài),并且新加的數(shù)據(jù)還要存在
2.1、往students表中添加數(shù)據(jù)
mysql>use?jiaowu;
mysql>insert?into?students?(Name,Age,Gender)?values?('hadoop',22,'M');
2.2、模擬一下,不小心將表刪除了
mysql>drop?tables?students;
2.3、查看一下二進(jìn)制日志文件的位置
mysql>show?master?status;
+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000002?|???520351?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+
2.4、先恢復(fù)完整數(shù)據(jù)(恢復(fù)過(guò)程不要記錄在日志中)
mysql>set?globalsql_log_bin=0;
#?mysql?
2.5、查看刪除表時(shí)的記錄位置
#?mysqlbinlog?/mybinlog/mysql-bin.000002??內(nèi)容如下:
#?at?520084
#130501?16:44:08?server?id?1 end_log_pos?520212?Query?thread_id=2exec_time=0error_code=0
use?jiaowu/*!*/;
SET?TIMESTAMP=1367397848/*!*/;
insert?into?students?(Name,Age,Gender)?values?('hadoop',22,'M')
/*!*/;
#?at?520212
#130501?16:44:08?server?id?1??end_log_pos?520239????Xid=308
COMMIT/*!*/;
#?at?520239 刪除命令在這個(gè)時(shí)刻開(kāi)始執(zhí)行的
#130501?16:45:37?server?id?1?end_log_pos?520351?Query thread_id=2exec_time=0error_code=0
SET?TIMESTAMP=1367397937/*!*/;
DROP?TABLE?`students`?/*?generated?by?server?*/
/*!*/;
DELIMITER?;
#?End?of?log?file
2.5、將二進(jìn)制文件中完整備份到刪除表之前的記錄導(dǎo)出
#?mysqlbinlog--stop-position=520239/mybinlog/mysql-bin.000002>/root/change.sql
解釋:
--start-position?指定從哪開(kāi)始導(dǎo)出二進(jìn)制日志
--stop-position?指定到哪結(jié)束
--start-datetime?從哪個(gè)時(shí)間開(kāi)始
--stop-datetime?到哪個(gè)時(shí)間結(jié)束
2.6、將改變的數(shù)據(jù)庫(kù)日志導(dǎo)入到mysql庫(kù)中
#?mysql
2.7、見(jiàn)證奇跡的時(shí)刻數(shù)據(jù)庫(kù)恢復(fù)成功,并且插入的數(shù)據(jù)也還原回來(lái)了
mysql>select?Name,Age,Gender?from?students?whereName='hadoop';
+--------+------+--------+
|?Name???|?Age??|?Gender?|
+--------+------+--------+
|?hadoop?|???22?|?M??????|
+--------+------+--------+
二、select命令也能完成邏輯備份比mysqldump更節(jié)約空間,速度更快,但比mysqldump用起來(lái)要麻煩,并且備份出來(lái)的數(shù)據(jù)都是純文本信息,沒(méi)有額外的開(kāi)銷空間,適合備份某張表模擬備份一張表
1、備份出來(lái),保存在某個(gè)目錄下,但需要注意的是,這個(gè)目錄下的文件的具有權(quán)限,當(dāng)?shù)卿浀絤ysql時(shí)需要具有執(zhí)行的權(quán)限
mysql>select?*?into?outfile?'/tmp/tutor.txt'?from?tutors;
保存為.txt格式:因?yàn)樗羌兾谋靖袷降?#xff0c;保存的是表格式的信息,如下所示:
#?cat?/tmp/tutor.txt
1???HongQigong??M???93
2???HuangYaoshi?M???63
3???Miejueshitai????F???72
4???OuYangfeng??M???76
5???YiDeng??M???90
6???YuCanghai???M???56
7???Jinlunfawang????M???67
8???HuYidao?M???42
9???NingZhongze?F???49
2、恢復(fù)數(shù)據(jù)庫(kù)需要?jiǎng)?chuàng)建一個(gè)空表,模仿原來(lái)的表創(chuàng)建
mysql>create?table?tutor?like?tutors;
把原來(lái)的表刪除了
mysql>drop?tutors;
mysql>load?data?infile?'/tmp/tutor.txt'?into?table?tutor;
驗(yàn)證:
mysql>select?*?from?tutor;
+-----+--------------+--------+------+
|?TID?|?Tname????????|?Gender?|?Age??|
+-----+--------------+--------+------+
|???1?|?HongQigong???|?M??????|???93?|
|???2?|?HuangYaoshi??|?M??????|???63?|
|???3?|?Miejueshitai?|?F??????|???72?|
|???4?|?OuYangfeng???|?M??????|???76?|
|???5?|?YiDeng???????|?M??????|???90?|
|???6?|?YuCanghai????|?M??????|???56?|
|???7?|?Jinlunfawang?|?M??????|???67?|
|???8?|?HuYidao??????|?M??????|???42?|
|???9?|?NingZhongze??|?F??????|???49?|
+-----+--------------+--------+------+
當(dāng)然用select也可以把表中符合條件的語(yǔ)句備份出來(lái),這里不再做演示了,很簡(jiǎn)單。
這種方法適合于某長(zhǎng)表的備份,但不會(huì)記錄到二進(jìn)制日志中
三、利用LVM快照從物理角度實(shí)現(xiàn)幾乎熱備的完全備份,配合二進(jìn)制日志備份實(shí)現(xiàn)增量備份,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)庫(kù)的備份。用lvm的快照來(lái)備份速度是非常快的,而且?guī)缀鯚醾?#xff0c;恢復(fù)也很快速,操作也簡(jiǎn)單,完整恢復(fù)后再將相應(yīng)二進(jìn)制恢復(fù)即可。前提:
1、數(shù)據(jù)文件要在邏輯卷上
2、此邏輯卷所在卷組必須有足夠空間使用快照卷
3、數(shù)據(jù)文件和事務(wù)日志要在同一個(gè)邏輯卷上
步驟:
1、啟動(dòng)事務(wù)
mysql>start?transaction;
模擬啟動(dòng)事務(wù)時(shí)能否施加鎖
mysql>insert?into?tutor?(Tname)?values?('stu001');
2、打開(kāi)會(huì)話,施加讀鎖,鎖定所有表,此時(shí)別人是不能執(zhí)行命令的(不能往數(shù)據(jù)庫(kù)中插入數(shù)據(jù))
mysql>flush?tables?with?read?lock;
mysql>flush?logs;
查看一下二進(jìn)制日志的位置:
mysql>show?master?status;
+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000003?|??????107?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+注意:執(zhí)行表鎖定時(shí),一定不要退出
3、通過(guò)另一個(gè)終端,保存二進(jìn)制日志文件及相關(guān)信息位置
創(chuàng)建備份路徑
#?mkdir?/backup/
#?mysql?-e?'show?master?status\G'?>/backup/master-`date?+%F`.info
如數(shù)據(jù)庫(kù)有用戶名和密碼要加?-u?-p
4、創(chuàng)建快照卷
#?lvcreate?-L?50M?-s?-p?r?-n?mydata-snap?/dev/myvg/mydata
5、釋放鎖
mysql>unlock?tables;
插入兩行數(shù)據(jù):
mysql>setsql_log_bin=1;
mysql>insert?into?tutor?(Tname)?values?('stu002');
mysql>insert?into?tutor?(Tname)?values?('stu003');
查看二進(jìn)制日志文件的位置
mysql>show?master?status;
+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000003?|??????573?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+
6、掛載快照卷,備份
#?mount?/dev/myvg/mydata-snap?/mnt/?-o?ro
查看:
#?ls?/mnt/
data??lost+found
創(chuàng)建備份目錄
#?mkdir?/backup/full-backup-`date?+%F`
#?cp?/mnt/data/*?/backup/full-backup-2013-05-06/?-a
7、卸載/mnt,刪除快照卷
#?umount?/mnt/
#?lvremove?--force?/dev/myvg/mydata-snap
8、增量備份二進(jìn)制日志
首先刪除二進(jìn)制日志文件,對(duì)我們沒(méi)有太大用處
#?rm?-rf?/backup/full-backup-2013-05-06/mysql-bin.*?-f
現(xiàn)在模擬數(shù)據(jù)庫(kù)被格式化
格式化之前先把二進(jìn)制日志備份出來(lái)
#?mysqlbinlog???/mydata/data/mysql-bin.000003>/backup/`date?+%F`.sql
關(guān)閉mysql服務(wù)器
#?service?mysqld?stop
#?rm?-rf?/mydata/data/*
#?cp?/backup/full-backup-2013-05-06/*?/mydata/data/?-a
mysql>use?jiaowu;
Database?changed
mysql>select?*?from?tutor;
+-----+--------------+--------+------+
|?TID?|?Tname????????|?Gender?|?Age??|
+-----+--------------+--------+------+
|???1?|?HongQigong???|?M??????|???93?|
|???2?|?HuangYaoshi??|?M??????|???63?|
|???3?|?Miejueshitai?|?F??????|???72?|
|???4?|?OuYangfeng???|?M??????|???76?|
|???5?|?YiDeng???????|?M??????|???90?|
|???6?|?YuCanghai????|?M??????|???56?|
|???7?|?Jinlunfawang?|?M??????|???67?|
|???8?|?HuYidao??????|?M??????|???42?|
|???9?|?NingZhongze??|?F??????|???49?|
+-----+--------------+--------+------+
將二進(jìn)制日志文件導(dǎo)入
mysql>source?/backup/2013-05-05.sql
mysql>select?*?from?tutor;
+-----+--------------+--------+------+
|?TID?|?Tname????????|?Gender?|?Age??|
+-----+--------------+--------+------+
|???1?|?HongQigong???|?M??????|???93?|
|???2?|?HuangYaoshi??|?M??????|???63?|
|???3?|?Miejueshitai?|?F??????|???72?|
|???4?|?OuYangfeng???|?M??????|???76?|
|???5?|?YiDeng???????|?M??????|???90?|
|???6?|?YuCanghai????|?M??????|???56?|
|???7?|?Jinlunfawang?|?M??????|???67?|
|???8?|?HuYidao??????|?M??????|???42?|
|???9?|?NingZhongze??|?F??????|???49?|
|??10?|?stu001???????|?M??????|?NULL?|
|??11?|?stu002???????|?M??????|?NULL?|
|??12?|?stu003???????|?M??????|?NULL?|
+-----+--------------+--------+------+
mysql>setsql_log_bin=1;
mysql>show?master?status;
+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000003?|??????107?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+
恢復(fù)到了還原前的狀態(tài)
這就是邏輯卷實(shí)現(xiàn)的一次完全備份
如果在完整備份后MySQL出現(xiàn)故障,與mysqldump一樣,先恢復(fù)上次的完整備份,再利用二進(jìn)制日志恢復(fù),找到完整備份時(shí)的二進(jìn)制位置,把從那時(shí)到故障前的日志用mysqlbinlog導(dǎo)出來(lái),然后導(dǎo)入到MySQL中就可以了。
總結(jié)
以上是生活随笔為你收集整理的mysql数据库备份总结_MySQL数据库备份总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Jira更换mysql数据库_JIRA6
- 下一篇: mysql字符集变为gbk_MYSQL数