一.備份數據的方式
1.物理備份
1.1冷備 cp tar等
1.2熱備 mysqlhotcopy 只能備份存儲引擎是myisam的表,依賴perl-DBD-MySQL
2.邏輯備份:用mysql自己提供的備份命令或第三放方軟件提供的備份命令,備份創建庫、表、和產生表記錄時的sql語句。
二.數據備份策略:
1.完整備份 備份數據庫服務器上的所有庫所有表。
2.差異備份 備份自完整備份後所有產生的新數據。
3.增量備份 備份自上一次備份後所有產生的新數據
生產環境一般採用 完整備份+增量備份 或者 完整備份+差異備份
三.邏輯備份與恢復
1.mysqldump命令做數據的完整備份
命令格式:
mysqldump -h數據庫服務器ip -u用戶名 -p密碼 數據庫名 > 目錄名/備份文件名
數據庫名的表示方式:
--all-databases 備份數據庫服務器上的所有庫所有表
數據庫名 對某個庫做完整備份
數據庫名 表 對指定庫裏的指定表做完整備份
-B 數據庫名1 數據庫名2 數據庫N 對某幾個庫做完整備份
#目錄名 :若備份時不寫目錄名備份文件就存放在,執行備份命令時 所在的目錄下
#備份文件名 :可以自己定義,要有標識性,約定俗成mysql的備份文件都以.sql 結尾
若文件重名,上一次備份會被當前備份覆蓋。
# 備份用來連接數據庫服務器的用戶,要有被備份的目標庫有相應的權限纔可以。
2.恢復完整備份數據
命令格式:
mysql -h數據庫服務器ip -u用戶名 -p密碼 數據庫名 < 目錄名/xxx.sql
mysql -h數據庫服務器ip -u用戶名 -p密碼 < 目錄名/xxx.sql
# 數據庫名:可選項,當備份文件中有 create database,use sql語句時,恢復數據時可以不指定數據庫名。
# 用完整備份文件 恢復數據,只能把數據恢復到備份時的狀態,完整備份之後產生的信息數據是無法恢復。
四.使用binlog日誌做增量備份與數據恢復
1.mysql日誌類型
mysql共有4種類型日誌:
binlog日誌(二進制日誌) 記錄除查詢之外sql語句。
錯誤日誌 記錄mysql服務在啓動和運行過程中產生的錯誤。
查詢日誌 記錄執行的所有的sql操作。
慢查詢日誌 只記錄超過指定時間,顯示查詢結果的sql語句。默認超時時間是10秒。
#默認情況下,mysql只開啓錯誤日誌。
#默認情況下日誌都存放在數據庫目錄下。每種日誌文件都默認命名方式。
2.啓用binlog日誌
vim /etc/my.cnf
[mysqld]
log_bin=/binlogdir/filename //設置存放binlog目錄和文件名,自定義目錄必須讓mysql用戶有寫入權限,目錄不設置則默認在數據庫目錄/var/lib/mysql/下,文件名不設置則默認爲:主機名-bin.000001
max-binlog-size=100M //設置binlog日誌文件的大小,不設置則默認爲500M自動生成第二個binlog日誌文件
service mysql restart
# 對所有庫操作的使用數據發送改變的sql語句都會寫進當前編號最大的binlog日誌文件裏。
# localhost-bin.index 記錄當前已有binlog日誌文件
3.分析binlog日誌文件內容。
binlog日誌記錄sql語句的方式:
① 時間方式
② 字符偏移量方式
命令格式:
mysqlbinlog [選項] binlog日誌文件名
選項:
偏移量
--start-position=100 起始位置
--stop-position=1200 結束位置
時間點:
--start-datetime="YYYY-mm-dd HH:MM:SS" 起始時間
--stop-datetime="YYYY-mm-dd HH:MM:SS" 結束時間
# 不加任何選項則默認查看全部日誌內容
4.手動生成新的binlog日誌文件方式:
① mysql>flush logs;
② #mysql -h數據庫服務器IP -u用戶名 -p密碼 -e "flush logs"
③ #mysqldump -h數據庫服務器IP -u用戶名 -p密碼 --flush-logs 數據庫名> /目錄名/xxx.sql
④ service mysql restart //一般不用
5.增量備份數據恢復
原理:使用mysqlbinlog提取歷史sql操作管道給mysql命令重做
命令格式:
mysqlbinlog [選項] binlog日誌文件名 | mysql -h數據庫服務器ip -u用戶名 -p密碼 數據庫名
批量恢復增量備份:
mysqlbinlog `cat localhost-bin.index`| mysql -h數據庫服務器ip -u用戶名 -p密碼 [數據庫名]
6.清理binlog日誌
刪除早於指定編號的binlog日誌文件:
mysql> PURGE MASTER LOGS TO 'binlog日誌文件名';
刪除所有binlog日誌文件,重建新日誌:
mysql> RESET MASTER;
五.第三方數據備份軟件Xtrabackup的使用
Xtrabackup是一款強大的在線熱備份工具,備份工程不鎖庫表
1.下載安裝軟件包
rpm -ivh percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm
依賴包perl-DBD-MySQL
rpm -ql percona-xtrabackup
/usr/bin/xtrabackup mysql服務軟件5.5以下版本
/usr/bin/xtrabackup_55 mysql服務軟件版本5.5
/usr/bin/xtrabackup_56 mysql服務軟件版本5.6
2.命令格式:
xtrabackup_56 <選項>
選項
--backup 執行備份數據操作
--prepare 準備恢復數據
--target-dir 指定備份目錄
--datadir 指定數據庫目錄
--incremental-basedir 指定對哪個目錄做增量備份
--incremental-dir 指定用哪個備份目錄做增量恢復
# xtrabackup 只備份表中記錄,不備份表結構。所以用xtrabackup備份的文件恢復數據時庫、表一定要存在。
3.Xtrabackup 完整備份與恢復
mkdir /mysqlbak/ //創建備份目錄
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/mysqlbak //執行完整備份
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/mysqlbak //完整恢復
cp /mysqlbak/xtrabackdb/* /var/lib/mysql/xtrabackdb/ //將要恢復的表記錄拷貝回數據庫下的庫裏,並覆蓋
service mysql restart //重啓服務就可看到恢復的數據
4.Xtrabackup 增量備份與恢復
# 增量備份時,必須事先有一次完整備份,這樣才知道哪些數據是新產生的數據。
mkdir /mysqlbak
mkdir /mysqlbak/first
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/mysqlbak/first //完整備份
mkdir /dbbak/second
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/mysqlbak/second --incremental-basedir=/mysqlbak/first //第一次增量備份
mkdir /dbbak/three
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/mysqlbak/third --incremental-basedir=/mysqlbak/second //第二次增量備份
增量備份數據恢復:
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/mysqlbak/first
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/mysqlbak/first --incremental-dir=/mysqlbak/second
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/mysqlbak/first --incremental-dir=/dbbak/third
cp /mysqlbak/first/xtrdb/* /var/lib/mysql/xtrdb/
service mysql restart