mysql資料備份三部曲--jluocc
1,前言
資料備份是容災的基礎,是指為防止系統出現操作失誤或系統故障導致資料丟失,而將全部或部分資料集合從應用主機的硬碟或陣列複製到其它的儲存介質的過程。傳統的資料備份主要是採用內建或外接的磁帶機進行冷備份。但是這種方式只能防止操作失誤等人為故障,而且其恢復時間也很長。隨著技術的不斷髮展,資料的海量增加,不少的企業開始採用網路備份。網路備份一般通過專業的資料儲存管理軟體結合相應的硬體和儲存裝置來實現。
2,資料備份分類
1)物理備份
物理備份簡稱冷備:就是直接拷貝,打包如:cp,tar
特點:
備份時資料庫的版本要一致
作業系統要一樣,不可跨平臺
不適合innodb儲存引擎的資料庫備份
備份時間長,冗餘備份,浪費儲存空間
....
2)邏輯備份
邏輯備份就是對資料庫物件(如使用者、表、儲存過程等)利用EXPORT,mysqldump等工具進行匯出工作,可以利用IMPORT,mysql等工具把邏輯備份檔案匯入到資料庫.
3,資料備份策略
完全備份:
備份所有資料.
增量備份:
備份上次備份後,備份所有新產生的資料.
差異備份:
備份完全備份後,備份所有新產生的資料.
4,部曲一-->mysqldump備份與恢復
用mysqldump備份,mysql來恢復資料
命令:
mysqldump -u 使用者名稱 -p'密碼' 庫名 > /路徑/xxx.sql #備份資料
mysql -u 使用者名稱 -p'密碼' 庫名 < 路徑/xxx.sql #恢復資料
備份資料庫名錶示方式:
--all-databases | -A 所有資料庫
資料庫名 單個數據庫
資料庫名 表名 單張表
-B 資料庫1 資料庫2 .... 多個數據
單個數據庫
[[email protected] ~]# mysqldump -uroot -p123456 db2 >/data/db2.sql
mysql>drop database db2;
mysql>create database db2;
[[email protected] ~]# mysql -uroot -p123456 db2 < /data/db2.sql
提示:恢復單個整個資料庫要先新建資料庫,需要先建資料庫
多個數據庫
[[email protected] ~]# mysqldump -uroot -p123456 -B db3 db4 >/data/db3-db4.sql
mysql>drop database db3;
mysql>drop database db4;
[ [email protected] ~]# mysql -uroot -p123456 < /data/db3-db4.sql
恢復全部資料庫
[[email protected] ~]# mysqldump -uroot -p123456 -A > /data/alldb.sql
[[email protected] ~]# mysql -uroot -p123456 < /data/alldb.sql
缺點:
鎖表
不能實現實時備份
效率較低,備份和還原速度慢
備份過程中,資料插入和更新操作會被掛起(鎖表)
4,部曲二-->mysqlbinlog工具
--binlog日誌
採用binlog日誌的好處:
記錄除查詢之外的所有sql命令
可用於資料恢復
配置mysql主從同步的必要條件
可以達到實時增量備份
1)啟用日誌檔案
[[email protected] ~]# mkdir /mysqllog
[[email protected] ~]# chown -R mysql:mysql /mysqllog
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
#log_bin #開啟日誌,使用預設,預設位置mysql的初始化目錄,名稱為主機名稱
#log_bin=jluo #開啟日誌,並指定日誌名稱
log_bin=/mysqllog/mysql #開啟日誌,並指定日誌位置和名稱
server_id=50 #mysql5.7必須寫,且id號不能重複
#Max_binlog_size=數字m #修改日誌大小,(預設1G),滿後自動新建另一個
binlog_format="mixed"
#statement:每一條修改資料的sql命令都記錄在binlog日誌中
#row:不記錄sql語句上下文相關資訊,僅儲存哪條記錄被修改
#mixed:是以上兩種格式的混合使用
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# ls /mysqllog/
mysql.000001 mysql.index #第一個檔案是日誌檔案,第二個是日誌索引檔案
2)手動生成新的日誌檔案
重啟mysql服務
執行sql操作 mysql>flush logs;
Mysqldump --flush-logs
Mysql -uroot -p密碼 -e ‘flush logs’ #-e 後面不能跟太複雜的命令
例子:mysqldump --flush-logs -uroot -p123456 db4 > /data/db4.sql
3)清理Binlog日誌
mysql> show master status; #檢視當前使用的日誌檔案
刪除早於指定版本的binlog日誌
Purge master logs to “binlog檔名”;
刪除所有binlog日誌,重建新日誌
Reset master;
提示:
不介意使用系統命令刪除,使用mysql命令刪除
例子:
mysql> purge master logs to "mysql.000004"; #刪除指定檔案之前的,不包括此檔案
mysql> reset master; #重建新日誌
4)mysqlbinlog工具
格式:
Mysqlbinlog [選項] binlog日誌檔名
常用選項
--start-datetime=”yyyy-mm-dd hh:mm:ss” #開始於時間點
--stop-datetime=”yyyy-mm-dd hh:mm:ss” #結束於時間點
--start-position=數字 #開始位置(偏移量)
--stop-position=數字 #結束偏移量
例子:
mysql> create table t1 (id int);
mysql> insert into t2 values (1);
mysql> insert into t2 values (2);
mysql> insert into t2 values (3);
[[email protected] mysqllog]# mysqlbinlog mysql.000001 | grep create
#181121 11:31:34 server id 50 end_log_pos 123 CRC32 0x9834a147 Start: binlog v 4, server v 5.7.17-log created 181121 11:31:34 at startup
create table t1 (id int)
[[email protected] mysqllog]# mysqlbinlog mysql.000001 | grep insert
insert into t1 values(1)
insert into t1 values(2)
insert into t1 values(3)
5)binlog恢復資料
思路:
使用mysqlbinlog提取歷史sql操作
通過管道交給mysql命令執行
例子:
[[email protected] mysqllog]# mysqldump -uroot -p123456 db2 < /data/db2.sql #備份
mysql> insert into t2 values(11,'陳紅',12);
mysql> update t2 set name='貂蟬' where id = 2;
mysql> drop database db2; #刪庫
mysql> create database db2;
[[email protected] mysqllog]# mysql -u root -p123456 db2 < /data/db2.sql
[[email protected] mysqllog]# mysqlbinlog --start-position=296 --stop-position=1857 mysql.000001 | mysql -u root -p123456
5,部曲三
XtraBackup工具
一款強大的線上熱備份工具
備份過程中不鎖庫表,適合生產環境,(備份到哪一行就鎖哪一行)
由專業組織percona提供(改進mysql分支)
主要含有兩個元件
Xtrabackup:c程式,支援innodb/xtradb
Innobackupex:以perl指令碼封裝xtrabackup,還支援myisam
提示:實際只有innodb儲存引擎支援實時增量備份
1)安裝軟體包
[[email protected] jluo]# yum -y install libev-4.15-1.el6.rf.x86_64.rpm
[[email protected] jluo]# yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
2)完全備份與恢復
格式:
Innobackupex 選項 路徑
基本選項:
--host:主機名,不寫預設本機地址
--user:使用者名稱
--port:埠號,不寫預設3306
--password:使用者密碼
--databases:資料庫名 #=”庫名”:單個庫 =”庫1 庫2”:多個庫 =”庫.表”:單個表 不寫預設備份所有庫
--no-timestamp:不用日期命令備份檔案儲存的子目錄名
--redo-only:日誌合併
--apply-log:準備還原(回滾日誌)
--copy-back:恢復資料
--incremental 目錄名:指定增量備份目錄(目錄必須為空)
--incremental-basedir=目錄名:增量備份時,指定上一次備份資料儲存的目錄名
--incremental-dir=目錄名:準備恢復資料時,指定增量備份資料儲存的目錄名
--export:匯出表資訊
import:匯出表空間
提示:
1,恢復全部資料庫時要求資料庫目錄必須為空,恢復單個或多個數據庫(資料表時不需要為空)
2,備份目錄必須為空
例子:
1,備份
1)備份前檢視資料庫資訊
mysql> show databases; #備份前檢視資料庫資訊
+--------------------+
| Database |
+--------------------+
| information_schema |
| db5 |
| mysql |
| performance_schema |
| stum |
| stusystem |
| sys |
+--------------------+
7 rows in set (0.01 sec)
2)完全備份[[email protected] ~]# innobackupex --user root --password 123456 --no-timestamp /bak/alldir
3)向表裡寫資料增量備份
mysql> insert into db5.t1 values(1212);
mysql> insert into db5.t1 values(1212);
[[email protected] ~]# innobackupex --user root --password 123456 --incremental /bak/new1dir --incremental-basedir=/bak/alldir --no-timestamp
4)再向表裡寫資料增量備份
mysql> insert into db5.t1 values(1313);
mysql> insert into db5.t1 values(1313);
[[email protected] ~]# innobackupex --user root --password 123456 --incremental /bak/new2dir --incremental-basedir=/bak/new1dir --no-timestamp
[[email protected] ~]# ls /bak/alldir/
backup-my.cnf mysql sys xtrabackup_logfile
db5 performance_schema xtrabackup_binlog_info
ib_buffer_pool stum xtrabackup_checkpoints
ibdata1 stusystem xtrabackup_info
[[email protected] ~]# vim /bak/alldir/xtrabackup_checkpoints #備份資訊檔案
backup_type = full-backuped #完全備份
from_lsn = 0 #lsn:日誌序列號
to_lsn = 7002759
last_lsn = 7002768
compact = 0
recover_binlog_info = 0
[[email protected] ~]# vim /bak//new1dir/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 7002759
to_lsn = 7005238
last_lsn = 7005247
compact = 0
recover_binlog_info = 0
[[email protected] ~]# vim /bak/new2dir/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 7005238
to_lsn = 7005861
last_lsn = 7005870
compact = 0
recover_binlog_info = 0
2,恢復資料
步驟:
1,準備恢復資料
2,合併日誌檔案(同時也拷貝資料到主目錄裡)
3,把備份目錄下資料拷貝到資料庫目錄下
4,修改資料庫目錄的所有者和組使用者為mysql
5,啟動資料庫服務
例子:
[[email protected] ~]# systemctl stop mysqld #停掉mysql
[[email protected] ~]# rm -rf /var/lib/mysql #刪掉資料庫,模擬資料庫損壞,要重新恢復資料
[[email protected] ~]# mkdir /var/lib/mysql #新建資料庫目錄
[[email protected] ~]# innobackupex --apply-log --redo-only /bak/alldir/
[[email protected] ~]# innobackupex --apply-log --redo-only --incremental-dir=/bak/new1dir/ /bak/alldir/
[[email protected] ~]# innobackupex --apply-log --redo-only --incremental-dir=/bak/new2dir/ /bak/alldir/
[[email protected] ~]# innobackupex --copy-back /bak/alldir/
[[email protected] ~]# chown -R mysql:mysql /var/lib/mysql
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p123456
mysql> show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db5 |
| mysql |
| performance_schema |
| stum |
| stusystem |
| sys |
+--------------------+
7 rows in set (0.01 sec)
3,恢復完全備份中的單個表
步驟:
1,備份單個數據庫
2,刪除資料庫的單個表
3,新建一張表,並且與剛才刪除表的結構一樣,並刪除該表的空間檔案
3,匯出表資訊
4,拷貝表資訊檔案到mysql目錄對應資料庫下
5,修改所有者許可權
6,匯入表空間
[[email protected] ~]# innobackupex --user root --password 123456 --databases="db5" /db5bak --no-timestamp #備份資料庫
mysql> drop table db5.t2; #模擬刪除庫
mysql> create table t2( name char(10));#新建的t2必須與刪除的t2表結構一樣
[[email protected] ~]# ls /var/lib/mysql/db5/ #檢視新建對應資料庫檔案
db.opt t1.frm t1.ibd t2.frm t2.ibd
mysql> alter table db5.t2 discard tablespace; #刪除表空間檔案,即刪除t2.idb檔案
[[email protected] ~]# ls /var/lib/mysql/db5/ #檢視刪除表空間後的資料庫檔案
db.opt t1.frm t1.ibd t2.frm
[[email protected] ~]# innobackupex --user root --password 123456 --apply-log --databases=”db5” --export /db5bak/ #匯出表資訊
[[email protected] ~]# cp /db5bak/db5/t2.{ibd,cfg,exp} /var/lib/mysql/db5/ #拷貝檔案
[[email protected] ~]# chown -R mysql:mysql /var/lib/mysql/db5/t2.* #授權
mysql> alter table db5.t2 import tablespace; #匯入表空間
mysql> select * from db5.t2; #檢視資料庫
4,注意事項
本次實驗主要以mysql資料備份為主,本文僅供參考,如有技術問題請留言.