https://blog.csdn.net/flyfish778/article/details/52451738
https://www.cnblogs.com/tongxiaoda/p/8507688.html
Mysqldump
用來生成MySQL的邏輯備份文件,其文件內容就是構成數據庫對象和數據內容的可重復執行的SQL語句。
mysqldump[OPTIONS]database[tables]mysqldump[OPTIONS]--databases[OPTIONS]DB1[DB2 DB3...]mysqldump[OPTIONS]--all-databases[OPTIONS]
options的關鍵參數:
-h,--host=name? 要導出的目標數據庫所在主機,默認是localhost-u,--user=name? 鏈接目標數據庫的數據庫用戶名-p,--password[=name]? 鏈接目標數據庫的數據庫密碼-P,--port=#? 鏈接目標數據庫的端口--add-drop-database? 在使用--databases或--all-databases參數時在每個create database命令前都加上drop database命令--add-drop-table? 在每個create table命令前加上drop table命令--default-character-set=name? 指定默認的字符集,默認是UTF8--replace? 使用該命令插入數據而不是使用insert命令--set-charset? 將set names default_character_set命令寫入到導出備份文件中,默認是開啟狀態--dump-slave[=#]? 表示從復制的slave從庫導出備份,且其中包含了change master 通語句。value參數如果不寫或=-1的情況下,則change master to語句寫入dump文件中,設置為2則表示也寫入dump文件中,只是會注釋掉--master-data[=#]? 表示從復制的主庫上導出備份。value參數與--dump-slave相同。使用該參數會自動打開lock-all-table參數,除非同時使用--single-transaction參數-T,--tab=name? 表示將備份文件以文本文件的方式生成,并指定存放文件路徑,每個表會生成兩個文件,一個是.sql文件保存表結構,一個是.txt文件保存表數據信息-A,--all-databases? 導出所有數據庫里的所有表-B,--databases? 導出指定的一個或多個數據庫--ignore-table=name? 代表導出過程中忽略某個指定表的導出,如果要忽略多個表則這個參數使用多次-d,--no-data? 代表只導出表結構-R,--routines? 代表導出時也要把存儲過程和函數也導出來--triggers? 代表導出時也將觸發器導出來-w,--where=name? 代表導出符合條件的數據-x,--lock-all-tables? 代表在導出過程中對每個數據庫的每個表加上一個只讀鎖--no-autocommit? 代表對每個表的數據導出內容用set autocommit=0和commit兩個語句包裹--single-transaction? 代表將事務隔離級別設置為可重復讀并在導出開始執行start transaction開啟一個新事務,在dump執行過程中也不會阻止任何讀寫操作
例子:
導出一個數據庫[root@localhost ~]# mysqldump -uroot -p -P3306 --databases course > backup.sql導出多個數據庫[root@localhost ~]# mysqldump -uroot -p -P3306 --databases course test > course.sql[root@localhost ~]# mysqldump -uroot -p -P3306 -B course test > course.sql導出所有數據庫[root@localhost ~]# mysqldump -uroot -p -P3306 --all-databases > all.sql僅導出course數據庫的數據,不包括表結構[root@localhost ~]# mysqldump -uroot -p -P3306 --no-create-info course > course.sql僅導出course數據庫中的students和students_myisam兩個表[root@localhost ~]# mysqldump -uroot -p -P3306 --no-create-info course students students_myisam > students.sql僅導出course數據庫的表結構[root@localhost ~]# mysqldump -uroot -p -P3306 --no-data course > course.sql導出course數據庫中除了teacher和score兩個表的其他表結構和數據[root@localhost ~]# mysqldump -uroot -p -P3306 --ignore-table=course.teacher --ignore-table=course.score course > course.sql導出course數據庫的表和存儲過程和觸發器[root@localhost ~]# mysqldump -uroot -p -P3306 --routines --triggers course > course.sql導出course數據庫中符合條件的數據[root@localhost ~]# mysqldump -uroot -p -P3306 --where="sid in (1,2)" course students students_myisam > course.sql遠程導出course數據庫[root@localhost ~]# mysqldump -uroot -p -P3306 -h192.168.1.178 cmdb_v2 students_myisam > students.sql在主庫備份[root@codis-178~]# mysqldump -uroot -p -P3306 --master-data=2 --single-transctions course > course.sql(在備份開始之初,在所有表上加一個只讀鎖(flush table withreadlock),當成功獲取該鎖并開始備份之后,此鎖就會立即釋放,后續dump過程不會影響其他的讀寫操作)在從庫備份[root@codis-178~]# mysqldump -uroot -p -P3306 --dump-slave --single-transctions test > test.sql
這里注意,導出時報以下錯誤:
[root@codis-178~]# mysqldump -uroot -p -P3306 -h192.168.1.68 course > course.sqlEnter password: mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1 (1064)
這是由于mysqldump版本低導致,也就是5.5版本不能導出5.7版本
如何解決?
用5.7或更高版本的mysqldump覆蓋或者指定目錄運行即可?
使用mysqldump命令導出文本文件,通過指定--tab=dir_name參數來指定文件路徑
添加配置secure-file-priv=/tmp/[root@localhost ~]# mysqldump -uroot -p -P3306 --tab=/tmp course[root@localhost ~]# ll /tmp/course.sql-rw-r--r--1root root1544Mar513:28/tmp/course.sql
還可指定文件格式
--fields-teminated-by=str
指定每個字段值之間的間隔符,默認是tab
--fields-enclosed-by=char
指定每個字段值使用什么字符括起來,默認是沒有
--fields-optionsally-enclosed-by=char
指定對每個非數字類型的字段使用什么字符括起來,默認沒有
--lines-terminated-by=str
指定行之間的結束符,默認是newline
[root@localhost ~]# mysqldump -uroot -p -P3306 --tab=/tmp course --fields-terminated-by=, --fields-enclosed-by="'" --lines-terminated-by="\n" courseEnter password: [root@localhost ~]# cat /tmp/course.txt '1','math','3''2','english','2''3','chinese','4''4','history','1''5','biology','5'
(3)select... into outfile
用來導出表中符合條件的數據到文本文件,不導出表結構
mysql> select * from students_myisam into outfile'/tmp/students_myisam_test.txt'fields terminatedby','enclosedby"'"lines teerminatedby'\r\n';Query OK,3rows affected (0.00sec)[root@localhost ~]# cat /tmp/students_myisam_test.txt '1','a','1','1''2','b','2','2''3','c','3','3'mysql> select * from students_myisam where sidin(1,2) into outfile'/tmp/students_myisam_test2.txt'fields terminatedby','encllosedby"'"lines terminatedby'\r\n';Query OK,2rows affected (0.01sec)[root@localhost ~]# cat /tmp/students_myisam_test2.txt '1','a','1','1''2','b','2','2'
參數說明:
terminated by
字段以什么字符分隔
enclosed by
字段以什么字符括起來
escaped by
轉義字符,默認是反斜杠
lines
每條記錄的分隔符,默認是換行符
local
指定從客戶主機讀文件,沒有指定則文件必須在服務器上
replace
新行將代替有相同的唯一值的現有行
ignore
跳過有唯一鍵的現有行的重復行的輸入,不指定時當遇到重復行會報錯
恢復
(1)普通恢復
導入一個備份文件mysql-uroot-pcourse
(2)恢復文本文件
先導入表結構
再導入數據文件
數據文件導入使用mysqlimport或是loaddatainfilemysqlimport -uroot -p--fields-terminated-by=, --fields-enclosed-by="'" --lines-terminated-by="\n" course /tmp/course.txtusecourse;loaddatainfile'/tmp/course.txt'intotablestudentsfieldsterminatedby','enclosedby"'"linesterminatedby'\r\n';
(3)全量恢復
將備份文件中的所有數據進行恢復,恢復完成后的數據就是生成備份的那一刻的數據狀態。
(4)基于時間點的恢復
將數據庫恢復到指定的某個時間點的狀態,通常需要依賴二進制日志將指定時間點前的所有數據庫操作都重新操作一遍。
步驟:
1.通過全量備份將數據庫恢復到上一個全量恢復的時間點
2.利用二進制日志恢復到指定時間點
開啟二進制日志
log-bin=mysql-binbinlog_format=ROWexpire_logs_days=10
測試實驗:
mysql> alter table students add tstamp timestamp;QueryOK,0rows affected (0.92sec)Records:0Duplicates:0Warnings:0mysql> flush logs;QueryOK,0rows affected (0.30sec)mysql> insert into students(sid,sname,gender,dept_id,tstamp) values(9,'Mix',1,2,now()),(10,'Tom',0,1,now());QueryOK,2rows affected (0.09sec)Records:2Duplicates:0Warnings:0mysql> flush logs;QueryOK,0rows affected (0.24sec)mysql> insert into students(sid,sname,gender,dept_id,tstamp) values(11,'Luis',-1,2,now()),(12,'Sun',0,3,now());QueryOK,2rows affected (0.09sec)Records:2Duplicates:0Warnings:0mysql> insert into students(sid,sname,gender,dept_id,tstamp) values(13,'Martis',-1,1,now()),(14,'Oifer',1,3,now());QueryOK,2rows affected (0.07sec)Records:2Duplicates:0Warnings:0mysql> flush logs;QueryOK,0rows affected (0.24sec)mysql> select * from students;+-----+--------+--------+---------+---------------------+| sid | sname? | gender | dept_id | tstamp? ? ? ? ? ? ? |+-----+--------+--------+---------+---------------------+|1| abc? ? |1|1|2018-03-0514:46:41||2|Andy|-1|1|2018-03-0514:46:41||3|Bob|-1|1|2018-03-0514:46:41||4|Ruth|-1|2|2018-03-0514:46:41||5|Mike|-1|2|2018-03-0514:46:41||6|John|0|3|2018-03-0514:46:41||7|Cindy|1|3|2018-03-0514:46:41||8|Susan|1|3|2018-03-0514:46:41||9|Mix|1|2|2018-03-0514:50:04||10|Tom|0|1|2018-03-0514:50:04||11|Luis|-1|2|2018-03-0514:51:48||12|Sun|0|3|2018-03-0514:51:48||13|Martis|-1|1|2018-03-0514:52:27||14|Oifer|1|3|2018-03-0514:52:27|+-----+--------+--------+---------+---------------------+14rows in set (0.00sec)mysql> truncate table students;QueryOK,0rows affected (0.21sec)mysql> select * from students;Emptyset (0.00sec)首先恢復students表的全量備份mysql> source backup.sql;mysql> select * from students;+-----+-------+--------+---------+---------------------+| sid | sname | gender | dept_id | tstamp? ? ? ? ? ? ? |+-----+-------+--------+---------+---------------------+|1| abc? |1|1|2018-03-0514:46:41||2|Andy|-1|1|2018-03-0514:46:41||3|Bob|-1|1|2018-03-0514:46:41||4|Ruth|-1|2|2018-03-0514:46:41||5|Mike|-1|2|2018-03-0514:46:41||6|John|0|3|2018-03-0514:46:41||7|Cindy|1|3|2018-03-0514:46:41||8|Susan|1|3|2018-03-0514:46:41|+-----+-------+--------+---------+---------------------+8rows in set (0.01sec)恢復某個時間點數據[root@localhost data]# mysqlbinlog mysql-bin.000002| mysql -uroot -pEnterpassword: mysql> select * from students;+-----+-------+--------+---------+---------------------+| sid | sname | gender | dept_id | tstamp? ? ? ? ? ? ? |+-----+-------+--------+---------+---------------------+|1| abc? |1|1|2018-03-0514:46:41||2|Andy|-1|1|2018-03-0514:46:41||3|Bob|-1|1|2018-03-0514:46:41||4|Ruth|-1|2|2018-03-0514:46:41||5|Mike|-1|2|2018-03-0514:46:41||6|John|0|3|2018-03-0514:46:41||7|Cindy|1|3|2018-03-0514:46:41||8|Susan|1|3|2018-03-0514:46:41||9|Mix|1|2|2018-03-0514:50:04||10|Tom|0|1|2018-03-0514:50:04|+-----+-------+--------+---------+---------------------+10rows in set (0.00sec)[root@localhost data]# mysqlbinlog mysql-bin.000003| mysql -uroot -pEnterpassword: mysql> select * from students;+-----+--------+--------+---------+---------------------+| sid | sname? | gender | dept_id | tstamp? ? ? ? ? ? ? |+-----+--------+--------+---------+---------------------+|1| abc? ? |1|1|2018-03-0514:46:41||2|Andy|-1|1|2018-03-0514:46:41||3|Bob|-1|1|2018-03-0514:46:41||4|Ruth|-1|2|2018-03-0514:46:41||5|Mike|-1|2|2018-03-0514:46:41||6|John|0|3|2018-03-0514:46:41||7|Cindy|1|3|2018-03-0514:46:41||8|Susan|1|3|2018-03-0514:46:41||9|Mix|1|2|2018-03-0514:50:04||10|Tom|0|1|2018-03-0514:50:04||11|Luis|-1|2|2018-03-0514:51:48||12|Sun|0|3|2018-03-0514:51:48||13|Martis|-1|1|2018-03-0514:52:27||14|Oifer|1|3|2018-03-0514:52:27|+-----+--------+--------+---------+---------------------+
如果恢復某個日志文件中的一部分內容,可以通過指定--start-datetime或是--stop-datetime參數來確定開始恢復和停止的時間。
mysqlbinlog --start-datetime="2018-02-05 10:23:41"/data1/mysql/data/mysql-bin.000001| mysql -uroot -pmysqlbinlog --stop-datetime="2018-03-05 15:00:00"/data1/mysql/data/mysql-bin.000001| mysql -uroot -p
六、Xtrabackup
Xtrabackup是一個對MySQL做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫)。
特點:
備份過程快、可靠
備份過程不會打斷正在執行的事務
能夠基于壓縮等功能節約磁盤空間和流量
自動實現備份檢驗
還原速度快
[root@localhost ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/tarball/percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz[root@localhost ~]# tar -zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz[root@localhost ~]# cp percona-xtrabackup-2.4.9-Linux-x86_64/bin/* /usr/bin/全量備份[root@localhost data1]# mkdir backup[root@localhost backup]# xtrabackup --backup --target-dir=/data1/backup/ -uroot -p'MY@)!&sql2017' -P3306 --host=127.0.0.1.........xtrabackup: Transactionlogof lsn (11460068) to (11460077) was copied.18030515:14:34completed OK!恢復[root@localhost mysql]# mv data data_bak[root@localhost mysql]# lsdata_bak[root@localhost mysql]# mkdir data[root@localhost mysql]# chown -R mysql:mysql data首先執行prepare,將所有的數據文件都準備到同一時間點,因為在備份過程中所有數據文件都在不同的時間點,如果直接恢復會導致沖突[root@localhost mysql]# xtrabackup --prepare --target-dir=/data1/backup/.........InnoDB: Shutdown completed;logsequence number1146147918030515:16:48completed OK!全量恢復[root@localhost mysql]# xtrabackup --copy-back --target-dir=/data1/backup/ --datadir=/data1/mysql/data.........18030515:20:17[01] Copying ./test1/app01.ibd to /data1/mysql/data/test1/app01.ibd18030515:20:17[01]? ? ? ? ...done18030515:20:17completed OK![root@localhost mysql]# chown -R mysql:mysql data
增量備份[root@localhost backup]# mkdir base[root@localhost backup]# chown -R mysql:mysql base[root@localhost backup]# xtrabackup --backup --traget-dir=/data1/backup/base -uroot -p'MY@)!&sql2017' -P3306 --host=127.0.0.1mysql> insert into studentsvalues(15,'aa',1,1,now());Query OK,1row affected (0.07sec)mysql> insert into studentsvalues(16,'bb',1,2,now());Query OK,1row affected (0.09 sec)[root@localhost ~]# xtrabackup --backup --target-dir=/data1/backup/inc1 --incremental-basedir=/data1/backup/base -uroot -p'MY@)!&sql2017' -P3306 --host=127.0.0.1mysql> insert into studentsvalues(17,'cc',0,3,now());Query OK,1row affected (0.19sec)mysql> insert into studentsvalues(18,'dd',-1,3,now());Query OK,1row affected (0.22sec)[root@localhost ~]# mkdir -p /data1/backup/inc2[root@localhost ~]# chown -R mysql:mysql /data1/backup/inc2[root@localhost ~]# xtrabackup --backup --target-dir=/data1/backup/inc2 --incremental-basedir=/data1/backup/inc1 -uroot -p'MY@)!&sql2017' -P3306 --host=127.0.0.1增量恢復[root@localhost mysql]# xtrabackup --prepare --apply=log-only --target-dir=/data1/backup/base --datadir=/data1/mysql/data[root@localhost mysql]# xtrabackup --prepare --apply-log-only --target-dir=/data1/backup/base --incremental-datadir=/data1/backup/inc1 --datadir=/data1/mysql/data[root@localhost mysql]# xtrabackup --prepare --target-dir=/data1/backup/base --incremental-datadir=/data1/backup/inc2 --datadir=/data1/mysql/data[root@localhost mysql]# xtrabackup --copy-back --target-dir=/data1/backup/base/ --datadir=/data1/mysql/datamysql>select* from students;+-----+--------+--------+---------+---------------------+| sid | sname? | gender | dept_id | tstamp? ? ? ? ? ? ? |+-----+--------+--------+---------+---------------------+|1| abc? ? |1|1|2018-03-0514:46:41||2| Andy? | -1|1|2018-03-0514:46:41||3| Bob? ? | -1|1|2018-03-0514:46:41||4| Ruth? | -1|2|2018-03-0514:46:41||5| Mike? | -1|2|2018-03-0514:46:41||6| John? |0|3|2018-03-0514:46:41||7| Cindy? |1|3|2018-03-0514:46:41||8| Susan? |1|3|2018-03-0514:46:41||9| Mix? ? |1|2|2018-03-0514:50:04||10| Tom? ? |0|1|2018-03-0514:50:04||11| Luis? | -1|2|2018-03-0514:51:48||12| Sun? ? |0|3|2018-03-0514:51:48||13| Martis | -1|1|2018-03-0514:52:27||14| Oifer? |1|3|2018-03-0514:52:27||15| aa? ? |1|1|2018-03-0515:34:55||16| bb? ? |1|2|2018-03-0515:35:55||17| cc? ? |0|3|2018-03-0515:42:14||18| dd? ? | -1|3|2018-03-0515:42:23|+-----+--------+--------+---------+---------------------+18rows in set (0.00sec)
1.利用mysqldump實現從邏輯角度完全備份mysql,配合二進制日志備份實現增量備份
2.利用lvs快照從物理角度實現幾乎熱備的完全備份,配合二進制日志備份實現增量備份
3.利用percona公司的xrabackup實現完全熱備份與增量熱備份
實驗環境:RHEL5.8 ,SElinux關閉,MySQL是tar包初始化安裝版本5.5.28
一.測試環境準備
1.1 mysql的安裝就不說了,見http://laoguang.blog.51cto.com/6013350/1039208
1.2 編緝/etc/my.cnf把二進制日志存放目錄改到其它非數據目錄,innodb每表一文件
建立一目錄用于存放二進制日志
mkdir /mybinlog ?
chown mysql:mysql /mybinlog
修改my.cnf
vim /etc/my.cnf
log-bin=/mybinlog/mysql-bin ? ?##二進制日志目錄及文件名前綴
innodb_file_per_table=1##啟用InnoDB表每表一文件,默認所有庫使用一個表空間
啟動mysqld
service mysqld start
1.3 創建一個測試庫與測試表
mysql>create database laoguang;
mysql>use laoguang;
mysql>create table linux ?(id tinyint auto_increment primary key,name char(10));
mysql>insert into linux (name) values ('apache'),('nginx'),('php');
1.4 創建用于存放備份的目錄
mkdir /myback
chown -R mysql:mysql /myback ?
二,用mysqldump實現備份
2.1 mysqldump用來溫備,所以我們得為所有庫加讀鎖,并且滾動一下二進制日志,并記錄當前二進制文件位置
mysqldump --all-databases --lock-all-tables ?--routines --triggers--master-data=2\
--flush-logs>/myback/2012-12-3.19-23.full.sql
--all-databases 備份所有庫
--lock-all-tables 為所有表加讀鎖
--routines 存儲過程與函數
--triggers 觸發器
--master-data=2在備份文件中記錄當前二進制日志的位置,并且為注釋的,1是不注釋掉在主從復制中才有意義
--flush-logs 日志滾動一次
查看有沒有備份成功,有沒有啟用新二進制的日志,查看備份的文件中有沒有記錄完整備份后二進制的位置
備份二進制日志
cp /mybinlog/mysql-bin.000001 /myback/2012-12-3.19-23.full.00001
2.2 模擬數據庫意外損壞,測試完整恢復
rm -rf /data/mydata/* ?
rm -rf
/mybinlog/*
初始化mysql并啟動mysql
cd /usr/local/mysql
./scripts/mysql_install_db--user=mysql--datadir=/data/mydata
rm -rf /mybinlog/* ##因為我們不是全新初始化的,可能會有報錯的二進制日志,我們不需要
service mysqld start ?##啟動時會重新生成新的二進制日志的
恢復到備份狀態,備份前先關閉對恢復過程的二進制日志記錄,因為記錄恢復語句是毫無意義的
mysql>set globalsql_log_bin=0;
mysql
打開記錄并查看恢復狀況
mysql>set globalsql_log_bin=1;
mysql>show databases;
打開二進制記錄并查看恢復狀況
mysql>set globalsql_log_bin=1;
mysql>show databases;
2.3 模擬一種場景,我往linux表中新添加了數據,然后不小心將這個表刪了,我們要恢復到刪除之前的狀態,并且新加的數據還存在。
2.3.1 新增數據
mysql>use laoguang;
mysql>insert into linux ?(name) values ('haddop'), ('mysql');
mysql>drop table linux;
mysql>show master status; ? ##查看當前所在二進制日志中的位置
+------------------+----------+--------------+------------------+
| File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | ? ? 9005 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ?
+------------------+----------+--------------+------------------+
我們先恢復完整數據,再恢復完整備份后到刪除之前的數據,對應二進制日志就是完整備份后的二進制日志位置到刪除表之前的位置
2.3.2 先恢復完整備份,同樣恢復過程不要記錄日志
mysql>set globalsql_log_bin=0;
mysql
2.3.3 查看刪除表時的記錄位置
mysqlbinlog /mybinlog/mysql-bin.000001 ?
# at 8893
#121202 14:14:07 server id 1 ?end_log_pos 9005 ?Querythread_id=5exec_time=0error_code=0
SETTIMESTAMP=1354428847/*!*/;
DROP TABLE `linux` /* generated by server */
/*!*/;
DELIMITER ;
# End of log file
2.3.4 由上圖可知刪除是在8893時做的,將二進制文件中完整備份到刪除表之前的記錄導出
mysqlbinlog--stop-position=8893/mybinlog/mysql-bin.000001>/tmp/change.sql
--start-position 指定從哪開始導出二進制日志
--stop-position 指定到哪結束
--start-datetime 從哪個時間開始格式如"2005-12-25 11:25:56"
--stop-datetime 到哪個時間結束
由于這個二進制日志是我們完整恢復后才啟用的,所以我們直接從頭開始即可,如果你的二進制日志很多,請查看完整備份中記錄的備份時的位置,從那開始到刪除之前即可
將這段二進制記錄應用到mysql的庫中
mysql
進入數據庫查看數據有沒有恢復
mysql>select * from linux;
基于mysqldump通常我們就是完整備份+二進制日志來進行恢復的。
三,利用lvm的快照來備份MySQL
要求你的MySQL的數據目錄必須在lvm卷上,下面來演示過程
3.1 建立lvm卷組,掛載到/data/mydata下,這個我就不演示了
3.2 初始化MySQL時將數據目錄指向/data/mydata,安裝過程見上鏈接
3.3 同樣如第一步那樣準備環境
3.4 在MySQL中為所有表加讀鎖,不要關閉終端,否則鎖將失效,滾動日志
mysql>flush tables with read lock;
mysql>flush logs;
mysql>show master status;
+------------------+----------+--------------+------------------+
| File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | ? ? ?107 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| ?
+------------------+----------+--------------+------------------+
3.5 另開一終端速度建立快照,我的那個卷組是/dev/myvg/mydata
lvcreate -L 200M -n mysql-snap -s -p r /dev/myvg/mydata ?
3.4 速度釋放讀鎖
mysql>unlock ?tables;
3.5 掛載快照,拷備出來,卸載快照,刪除快照
mount /dev/myvg/mysql-snap /mnt
mkdir /myback/lvm
cp -pR /mnt/* /myback/lvm ?
umount /mnt
lvremove /dev/myvg/mysql-snap
3.6 就這樣一次完整備份就完成了,下面來測試能否正常使用
servivce mysqld stop
rm -R /data/mydata/* ?
cp -Rp /myback/lvm/* /data/mydata
service mysqld start ?##如果能正常啟動代表沒有問題,起不來請看數據目錄權限
3.7 如果在完整備份后MySQL出現故障,與mysqldump一樣,先恢復上次的完整備份,再利用二進制日志恢復,二進制恢復再啰嗦一遍,找到完整備份時的二進制位置,把從那時到故障前的日志用mysqlbinlog導出來,然后批處理方式導入到MySQL中。這個同mysqldump中實驗一致就不重復了。
用lvm的快照來備份速度是非常快的,而且幾乎熱備,恢復也很快速,操作也簡單,完整恢復后再將相應二進制恢復即可。
四:基于xtrabackup來完全備份,增量備份,熱備份MySQL
下載地址:http://www.percona.com/software/percona-xtrabackup
4.1 下載安裝xtrabackup,我用的是percona-xtrabackup-2.0.3-470.rhel5.i386.rpm
yum install perl-DBD-MySQL
rpm -ivh percona-xtrabackup-2.0.3-470.rhel5.i386.rpm
4.2 MySQL基本環境與第一步的一致
4.3 為備份建立一個只有備份權限的用戶
mysql>create user 'percona'@'localhost' identified by 'redhat';
mysql>revoke all privileges,grant option from 'percona'@'localhost';
mysql>grant reload,lock tables,replication client on *.* to 'percona'@'localhost';
mysql>flush privileges;
4.4 完整備份一次MySQL
innobackupex--host=locahost?--user=percona?--password=redhat --defaults-file=/usr/local/mysql/my.cnf?/myback/
數據會完整備份到/myback/中目錄名字為當前的日期,extrabackup會備份所有的InnoDB表,MyISAM表只是復制表結構文件、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。除了保存數據外還生成了一些extrabackup需要的數據文件
1)xtrabackup_checkpoints?備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
2)xtrabackup_binlog_info mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。
3)xtrabackup_binlog_pos_innodb ?二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。
4)xtrabackup_binary ?備份中用到的xtrabackup的可執行文件;
5)backup-my.cnf?備份命令用到的配置選項信息;
4.4 測試恢復MySQL,用extrabackup來完整恢復
service mysqld stop
rm -Rf /data/mydata
innobackupex --apply-log /myback/2012-12-02_20-06-12/
--apply-log 的意義在于把備份時沒commit的事務撤銷,已經commit的但還在事務日志中的應用到數據庫
innobackupex --copy-back /myback/2012-12-02_20-06-12/
--copy-back數據庫恢復,后面跟上備份目錄的位置
chown -R mysql:mysql /data/mydata ?
service mysqld start ##如果能啟動代表恢復正常
4.5 我們來實驗一下增量備份
4.5.1 在表中新增一些數據
mysql>insert into linux (name) values ('tomcat'), ('memcache'), ('varnish');
4.5.2 增量備份
innobackupex--user=percona--password=redhat--incremental \
--incremental-basedir=/myback/2012-12-02_20-06-12/ /myback/
--incremental 指定是增量備份
--incremental-basedir 指定基于哪個備份做增量備份,最后是增量備份保存的目錄
增量備份只能對InnoDB引擎做增量備份,對MyISAM的表是完全復制
4.6 測試增量備份恢復
service mysqld stop
rm -Rf /data/mydata/*
innobackupex --apply-log --redo-only /myback/2012-12-02_20-06-12/
--redo-only 指的是把備份時commit的但還在事務日志中的應用到時數據,但是還沒提交的不撤消,
因為這個事務可能在增量備份中提交,假如的撤消了增量備份中就提交不,因為事務已經不完整
將增量備份全并到完整備份中去
innobackupex --apply-log /myback/2012-12-02_20-06-12/ \
--incremental-dir=/myback/2012-12-02_20-28-49/
/myback/2012-12-02_20-06-12/ 這個是完整備份的目錄
--incremental-dir 后跟的是增量備份的目錄
這個會使增量備份中的的數據合并到完整備份中,如果還有增量備份,繼續合并,恢復時恢復完整備份即可
恢復數據,并起動MySQL
innobackupex --copy-back /myback/2012-12-02_20-06-12/
chown -R mysql:mysql /data/mydata
service mysqld start