mysql数据库备份总结_MySQL数据库备份总结
一個企業的正常運行,數據的完整性是最關鍵的;所以我們需要在工作中要很熟練的掌握數據的備份與恢復方法;下面是對Mysql數據庫備份的三種方法總結,希望對大家會有所幫助
備份開始前的工作環境準備:
1、創建用于保存二進制日志文件的目錄
#?mkdir?/mybinlog
#?chown?mysql.mysql?/mybinlog
2、修改配置文件
#?vim?/etc/my.cnf
log-bin=/mybinlog/mysql-bin???二進制日志目錄及文件前綴
innodb_file_per_table=1啟用innoDB表
datadir=?/mydata/data????指定數據庫的目錄
3、為備份數據庫創建存放點
#?mkdir?/mybackup
#?chown?-R?mysql.mysql?/mybackup
4、啟動mysql服務器
#?service?mysqld?start
5、插入需要備份的數據庫
#?mysql
一、使用mysqldump工具完成完全備份+增量備份基于mysqldump通常就是完整備份+二進制日志來進行恢復數據
1.1、mysqldump用來溫備份,首先需要為所有庫加讀鎖,并且滾動一下二進制日志,記錄當前二進制文件位置
#?mysqldump?--all-databases?--lock-all-tables?--routines?--triggers--master-data=2
--flush-logs>/mybackup/alldatabase.sql
解釋各個選項的意義:
--all-databases?備份所有數據庫
--lock-all-tables?為所有表加鎖
--routines?存儲過程與存儲函數
--triggers?觸發器
--master-data=2以change?master?to的方式記錄位置,但默認為被注釋
--flush-logs??執行日志滾動
1.2、備份二進制日志
#?cp?/mybinlog/mysql-bin.000001?/mybackup/alldatabase.000001
1.3、模擬數據庫意外損壞,利用完全備份實現數據庫的恢復
#?rm?-rf?/mydata/data/*
#?rm?-rf?/mybinlog/*
1.4、初始化mysql并啟動服務器
#?cd?/usr/local/mysql/
#?./scripts/mysql_install_db?--user=mysql--datadir=/mydata/data
1.5、刪除二進制日志,啟動服務
#?rm?-rf?/mybinlog/*
#?netstat?-tnlp?查看啟動的mysql進程號
tcp????????0??????0?0.0.0.0:3306???????????0.0.0.0:*???????????LISTEN??????2523/mysql
#?kill?2523??(注意,如果在備份之前mysql服務是開啟的,重啟是不成功的,需要把這個進程先kill掉)
#?service?mysqld?restart
1.6、恢復到備份狀態,導入備份的數據庫文件:
#?mysql
2、模擬往students表中添加數據,添加完成后不小心將表刪除了,我們要恢復到刪除之前的狀態,并且新加的數據還要存在
2.1、往students表中添加數據
mysql>use?jiaowu;
mysql>insert?into?students?(Name,Age,Gender)?values?('hadoop',22,'M');
2.2、模擬一下,不小心將表刪除了
mysql>drop?tables?students;
2.3、查看一下二進制日志文件的位置
mysql>show?master?status;
+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000002?|???520351?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+
2.4、先恢復完整數據(恢復過程不要記錄在日志中)
mysql>set?globalsql_log_bin=0;
#?mysql?
2.5、查看刪除表時的記錄位置
#?mysqlbinlog?/mybinlog/mysql-bin.000002??內容如下:
#?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 刪除命令在這個時刻開始執行的
#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、將二進制文件中完整備份到刪除表之前的記錄導出
#?mysqlbinlog--stop-position=520239/mybinlog/mysql-bin.000002>/root/change.sql
解釋:
--start-position?指定從哪開始導出二進制日志
--stop-position?指定到哪結束
--start-datetime?從哪個時間開始
--stop-datetime?到哪個時間結束
2.6、將改變的數據庫日志導入到mysql庫中
#?mysql
2.7、見證奇跡的時刻數據庫恢復成功,并且插入的數據也還原回來了
mysql>select?Name,Age,Gender?from?students?whereName='hadoop';
+--------+------+--------+
|?Name???|?Age??|?Gender?|
+--------+------+--------+
|?hadoop?|???22?|?M??????|
+--------+------+--------+
二、select命令也能完成邏輯備份比mysqldump更節約空間,速度更快,但比mysqldump用起來要麻煩,并且備份出來的數據都是純文本信息,沒有額外的開銷空間,適合備份某張表模擬備份一張表
1、備份出來,保存在某個目錄下,但需要注意的是,這個目錄下的文件的具有權限,當登錄到mysql時需要具有執行的權限
mysql>select?*?into?outfile?'/tmp/tutor.txt'?from?tutors;
保存為.txt格式:因為它是純文本格式的,保存的是表格式的信息,如下所示:
#?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、恢復數據庫需要創建一個空表,模仿原來的表創建
mysql>create?table?tutor?like?tutors;
把原來的表刪除了
mysql>drop?tutors;
mysql>load?data?infile?'/tmp/tutor.txt'?into?table?tutor;
驗證:
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?|
+-----+--------------+--------+------+
當然用select也可以把表中符合條件的語句備份出來,這里不再做演示了,很簡單。
這種方法適合于某長表的備份,但不會記錄到二進制日志中
三、利用LVM快照從物理角度實現幾乎熱備的完全備份,配合二進制日志備份實現增量備份,進而實現數據庫的備份。用lvm的快照來備份速度是非常快的,而且幾乎熱備,恢復也很快速,操作也簡單,完整恢復后再將相應二進制恢復即可。前提:
1、數據文件要在邏輯卷上
2、此邏輯卷所在卷組必須有足夠空間使用快照卷
3、數據文件和事務日志要在同一個邏輯卷上
步驟:
1、啟動事務
mysql>start?transaction;
模擬啟動事務時能否施加鎖
mysql>insert?into?tutor?(Tname)?values?('stu001');
2、打開會話,施加讀鎖,鎖定所有表,此時別人是不能執行命令的(不能往數據庫中插入數據)
mysql>flush?tables?with?read?lock;
mysql>flush?logs;
查看一下二進制日志的位置:
mysql>show?master?status;
+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000003?|??????107?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+注意:執行表鎖定時,一定不要退出
3、通過另一個終端,保存二進制日志文件及相關信息位置
創建備份路徑
#?mkdir?/backup/
#?mysql?-e?'show?master?status\G'?>/backup/master-`date?+%F`.info
如數據庫有用戶名和密碼要加?-u?-p
4、創建快照卷
#?lvcreate?-L?50M?-s?-p?r?-n?mydata-snap?/dev/myvg/mydata
5、釋放鎖
mysql>unlock?tables;
插入兩行數據:
mysql>setsql_log_bin=1;
mysql>insert?into?tutor?(Tname)?values?('stu002');
mysql>insert?into?tutor?(Tname)?values?('stu003');
查看二進制日志文件的位置
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
創建備份目錄
#?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、增量備份二進制日志
首先刪除二進制日志文件,對我們沒有太大用處
#?rm?-rf?/backup/full-backup-2013-05-06/mysql-bin.*?-f
現在模擬數據庫被格式化
格式化之前先把二進制日志備份出來
#?mysqlbinlog???/mydata/data/mysql-bin.000003>/backup/`date?+%F`.sql
關閉mysql服務器
#?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?|
+-----+--------------+--------+------+
將二進制日志文件導入
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?|??????????????|??????????????????|
+------------------+----------+--------------+------------------+
恢復到了還原前的狀態
這就是邏輯卷實現的一次完全備份
如果在完整備份后MySQL出現故障,與mysqldump一樣,先恢復上次的完整備份,再利用二進制日志恢復,找到完整備份時的二進制位置,把從那時到故障前的日志用mysqlbinlog導出來,然后導入到MySQL中就可以了。
總結
以上是生活随笔為你收集整理的mysql数据库备份总结_MySQL数据库备份总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jira更换mysql数据库_JIRA6
- 下一篇: 重磅!小米汽车亮相工信部网站 造型酷炫