mysql所有备份与恢复
一、mysqldump 備份結合 binlog 日志恢復 MySQL 備份一般采取全庫備份加日志備份的方式,例如每天執行一次全備份,每小時執行一 次二進制日志備份。這樣在 MySQL 故障后可以使用全備份和日志備份將數據恢復到最后一個 二進制日志備份前的任意位置或時間。
1、binlog 介紹 mysql 的二進制日志記錄著該數據庫的所有增刪改的操作日志(前提是要在自己的服務器上 開啟 binlog),還包括了這些操作的執行時間。為了顯示這些二進制內容,我們可以使用 mysqlbinlog 命令來查看。
Binlog 的用途
1:主從同步
2:恢復數據庫
開啟binary log 功能
通過編輯 my.cnf 中的 log-bin 選項可以開啟二進制日志;形式如下:
log-bin [=mysql-bin]
其中,DIR 參數指定二進制文件的存儲路徑;filename 參數指定二級制文件的文件名,其形 式為 filename.number,number 的形式為 000001、000002 等。
每次重啟 mysql 服務或運行mysql> flush logs;都會生成一個新的二進制日志文件,這些日志文件的 number 會不斷地遞增。 除了生成上述的文件外還會生成一個名為 filename.index 的文件。這個文件中存儲所有二進 制日志文件的清單又稱為二進制文件的索引
配置保存以后重啟 mysql 的服務器,用 mysql> show variables like 'log_bin';查看 bin-log 是否 開啟,
如圖:
查看產生的 binary log 注:查看 binlog 內容是為了恢復數據
bin-log 因為是二進制文件,不能通過文件內容查看命令直接打開查看,
mysql 提供兩種方式 查看方式,在介紹之前,我們先對數據庫進行一下增刪改的操作,否則 log 里邊數據有點空
#mysql -uroot -p -e "reset master"http:// 清空所有的二進制文件,從 00001開始
#mysql -uroot -p -e "create database test"
#mysql -uroot -p -e "use test;create table tb1(id int primary key auto_increment,name varchar(20))"
#mysql -uroot -p -e "insert into test.tb1(name) values('lisi')"
#mysql -uroot -p -e "insert into test.tb1(name) values('zhangsan')"
重新開始一個新的日志文件
#mysql -uroot -p -e "flush logs"
#mysql -uroot -p -e "delete from test.tb1 where id=2"
#mysql -uroot -p -e "insert into test.tb1(name) values('tom')"
# mysql -uroot -p -e "select * from test.tb1"
Enter password:
查看 MySQL Server 上的二進制日志
mysql> show binary logs;
查看二進制日志中的事件
mysql> show binlog events;
默認顯示可找到的第一個二進制日志文件中的事件,包含了日志文件名、事件的開始位置、 事件類型、結束位置、信息等內容
在實際生產環境中,如果遇到需要恢復數據庫的情況,不要讓用戶能訪問到數據庫, 以避免新的數據插入進來,以及在主從的環境下,關閉主從。
(查詢)# cd /usr/local/mysql/data/
# mysqlbinlog -v(兩個v也可以) mysql-bin.000002
從中可以看出 delete 事件發生 position 是 287,事件結束 position 是 416
恢復流程:直接用 bin-log 日志將數據庫恢復到刪除位置 287 前,然后跳過故障點,再進行恢復 下面所有的操作,命令如下
由于之前沒有做過全庫備份,所以要使用所有 binlog 日志恢復,所以生產環境中需要很長時 間恢復,導出相關 binlog 文件
#mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 > /opt/mysql-bin.000001.sql
#mysqlbinlog --stop-position=287 /usr/local/mysql/data/mysql-bin.000002 > /opt/287.sql
#mysqlbinlog --start-position=416 /usr/local/mysql/data/mysql-bin.000002 > /opt/416.sql
刪除 test 數據庫
mysql>drop database test;
利用 binlog 恢復數據
#mysql -uroot -p123456< /opt/mysql-bin.000001.sql
#mysql -uroot -p123456< /opt/287.sql
#mysql -uroot -p123456< /opt/416.sql
恢復完成后,我們檢查下表的數據是否完整
mysql> select * from test.tb1;
Ok 完整的都恢復過來了
mysqlbinlog 選項示例
常見的選項有以下幾個:
--start-datetime 從二進制日志中讀取指定時間戳或者本地計算機時間之后的日志事件。
--stop-datetime 從二進制日志中讀取指定時間戳或者本地計算機時間之前的日志事件。
--start-position 從二進制日志中讀取指定 position 事件位置作為開始。
--stop-position 從二進制日志中讀取指定 position 事件位置作為事件截至。
2、mysqldump 介紹
mysqldump 是 mysql 用于備份和數據轉移的一個工具。
它主要產生一系列的 SQL 語句,可以 封裝到文件,該文件包含有所有重建你的數據庫所需要的 SQL 命令如 CREATE DATABASE, CREATE TABLE,INSERT 等等。
可以用來實現輕量級的快速遷移或恢復數據庫。
mysqldump 是將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適, 這也是最常用的備份方法。
mysqldump 一般在數據量很小的時候(幾個 G)可以用于備份。當數據量比較大的情況下, 就不建議用 mysqldump 工具進行備份了。 數據庫的導出 導出對象說明: mysqldump 可以針對單個表、多個表、單個數據庫、多個數據庫、所有數據庫進行導出的操作
# mysqldump [options] db_name [tbl_name ...] //導出指定數據庫或單個表
# mysqldump [options] --databases db_name ... //導出多個數據庫
#mysqldump [options] --all-databases //導出所有
導出數據庫 tes
# mysqldump -uroot -p --flush-logs test > /opt/test.sql //--flush-logs 這個選項就會完整備份
數據庫的導入
# mysql -uroot -p test < /opt/test.sql
舉例 刪除庫并恢復:
(備份)
(恢復) (如果報錯 說明創建個你要創建的數據庫就可以)
刪除表:
(備份表)
(恢復表)
在前面我們介紹了 mysql 的 binlog 和 mysqldump 工具,下面我們來學習如何實現 mysqldump
全庫備份+binlog 的數據恢復
環境準備與備份還原:
檢查開啟 binlog
先創建一些原始數據
mysql> reset master;
mysql> create database test_db;
mysql> use test_db;
mysql> create table tb1(id int primary key auto_increment,name varchar(20));
mysql> insert into tb1(name) values('tom1');
mysql> insert into tb1(name) values('tom2');
mysql> commit;
mysql> select * from tb1;
方案:mysqldump 全庫備份+binlog 還原
1、mysqldump 備份方案:
每周一凌晨 1 點全庫備份
2、備份步驟
(1)創建備份目錄 # mkdir /opt/mysqlbackup
# mkdir /opt/mysqlbackup/daily
(2)全庫備份
這里我們模擬周一的完整備份數據庫任務
#mysqldump -uroot -p --flush-logs test_db > /opt/mysqlbackup/test_db_2016_09_12.sql (test_db_`date +%Y%m%d_%H%M%S`)
ls -l /opt/mysqlbackup/
-rw-r--r--. 1 root root 1871 Sep 13 21:06 test_db_2016_09_12.sql
備份 mysqldump 全庫備份之前的 binlog 日志文(注:生產環境中可能不只一個 binlog 文件)
# cp /usr/local/mysql/data/mysql-bin.000001 /opt/mysqlbackup/daily/
# mysql -uroot -p -e "purge binary logs to 'mysql-bin.000002'"
模擬下操作失誤,將數據修改錯誤了。
mysql> use test_db;
mysql> delete from tb1 where id=1;
mysql> commit;
mysql> insert into tb1(name) values('tom3');
mysql> commit;
備份自 mysqldump 之后的 binlog 日志文件
cp /usr/local/mysql/data/mysql-bin.000002 /opt/mysqlbackup/daily/
上面的模擬的誤操作是刪除了 id=1 的記錄
(3)現在我們使用 mysqldump 的全庫備份和 binlog 來恢復數據。
使用 mysqldump 的備份進行全庫恢復
# mysql -uroot -p test_db < /opt/mysqlbackup/test_db_2016_09_12.sql
查詢一下數據
mysql -uroot -p -e "select * from test_db.tb1"
從顯示結果可以看到使用 mysqldump 備份將數據還原到了備份時的狀態,剛才刪除的數據 (id=2)恢復回來了,但備份后產生的數據卻丟失了所以還得利用 binlog 進一步還原 因為刪除是在全庫備份后發生的,而 mysqldump 全庫備份時使用--flush-logs 選項,所以只需 要分析全庫備份后的 binlog 即 mysql-bin.000002。
mysql> show binary logs;
查看 mysql-bin.000002 中的事件,可以看到有刪除事件
#mysqlbinlog -vv /opt/mysqlbackup/daily/mysql-bin.000002
通過 mysqlbinlog 命令所顯示的結果可以看到誤操作 delete 的開始 postion 為 219,結束 position 是 422。
從二進制日志中讀取指定 position=219 事件位置作為截至,即把數據恢復到 delete 刪除前
# mysqlbinlog --stop-position=219 /opt/mysqlbackup/daily/mysql-bin.000002 | mysql -u root -p
從二進制日志中讀取指定 position=422 事件位置作為開始,即跳過刪除事件,恢復刪除事件 之后對數據的正常操作
#mysqlbinlog --start-position=422 /opt/mysqlbackup/daily/mysql-bin.000002 | mysql -u root -p
查看恢復結果: # mysql -uroot -p -e "select * from test_db.tb1"
總結
以上是生活随笔為你收集整理的mysql所有备份与恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stark
- 下一篇: PhotoShop CS6实现照片背景虚