1. 程式人生 > >mysql數據備份三部曲--jluocc

mysql數據備份三部曲--jluocc

磁帶機 schema host 留言 刪掉 註意 basedir 系統命令 初始

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 ....  多個數據

單個數據庫

[root@mysql-50 ~]# mysqldump -uroot -p123456 db2 >/data/db2.sql
mysql>drop database db2;
mysql>create database db2;
[root@mysql-50 ~]# mysql -uroot -p123456 db2 < /data/db2.sql
提示:恢復單個整個數據庫要先新建數據庫,需要先建數據庫

多個數據庫

[root@mysql-50 ~]# mysqldump -uroot -p123456 -B db3 db4 >/data/db3-db4.sql
mysql>drop database db3;
mysql>drop database db4;
[root@mysql-50 ~]# mysql -uroot -p123456 < /data/db3-db4.sql

恢復全部數據庫

[root@mysql-50 ~]# mysqldump -uroot -p123456 -A > /data/alldb.sql
[root@mysql-50 ~]# mysql -uroot -p123456 < /data/alldb.sql

缺點:
  鎖表
  不能實現實時備份
  效率較低,備份和還原速度慢
  備份過程中,數據插入和更新操作會被掛起(鎖表)

4,部曲二-->mysqlbinlog工具
--binlog日誌
采用binlog日誌的好處:
記錄除查詢之外的所有sql命令
可用於數據恢復
配置mysql主從同步的必要條件
可以達到實時增量備份

1)啟用日誌文件

[root@mysql-50 ~]# mkdir /mysqllog
[root@mysql-50 ~]# chown -R mysql:mysql /mysqllog
[root@mysql-50 ~]# 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:是以上兩種格式的混合使用

[root@mysql-50 ~]# systemctl restart mysqld
[root@mysql-50 ~]# 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 &gt; /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);
[root@mysql-50 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)
[root@mysql-50 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命令執行

例子:

[root@mysql-50 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;
[root@mysql-50 mysqllog]# mysql -u root -p123456 db2 < /data/db2.sql 
[root@mysql-50 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)安裝軟件包

[root@mysql-50 jluo]# yum -y install libev-4.15-1.el6.rf.x86_64.rpm
[root@mysql-50 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)完全備份
[root@mysql-50 ~]# innobackupex --user root --password 123456 --no-timestamp /bak/alldir

3)向表裏寫數據增量備份

mysql> insert into db5.t1 values(1212);
mysql> insert into db5.t1 values(1212);
[root@mysql-50 ~]# 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);
[root@mysql-50 ~]# innobackupex --user root --password 123456 --incremental /bak/new2dir --incremental-basedir=/bak/new1dir --no-timestamp

[root@mysql-50 ~]# 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

[root@mysql-50 ~]# 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

[root@mysql-50 ~]# vim /bak//new1dir/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 7002759
to_lsn = 7005238
last_lsn = 7005247
compact = 0
recover_binlog_info = 0

[root@mysql-50 ~]#  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,啟動數據庫服務
例子:

[root@mysql-50 ~]# systemctl stop mysqld #停掉mysql
[root@mysql-50 ~]# rm -rf /var/lib/mysql #刪掉數據庫,模擬數據庫損壞,要重新恢復數據
[root@mysql-50 ~]# mkdir /var/lib/mysql #新建數據庫目錄

[root@mysql-50 ~]# innobackupex --apply-log --redo-only /bak/alldir/
[root@mysql-50 ~]# innobackupex --apply-log --redo-only --incremental-dir=/bak/new1dir/  /bak/alldir/
[root@mysql-50 ~]# innobackupex --apply-log --redo-only --incremental-dir=/bak/new2dir/  /bak/alldir/
[root@mysql-50 ~]# innobackupex --copy-back /bak/alldir/
[root@mysql-50 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql-50 ~]# systemctl restart mysqld
[root@mysql-50 ~]# 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,導入表空間

[root@mysql-50 ~]# innobackupex --user root  --password 123456 --databases="db5"  /db5bak  --no-timestamp #備份數據庫
mysql> drop table db5.t2;  #模擬刪除庫
mysql> create table t2( name char(10));#新建的t2必須與刪除的t2表結構一樣
[root@mysql-50 ~]# ls /var/lib/mysql/db5/ #查看新建對應數據庫文件
db.opt  t1.frm  t1.ibd  t2.frm  t2.ibd
mysql> alter table db5.t2 discard tablespace; #刪除表空間文件,即刪除t2.idb文件
[root@mysql-50 ~]# ls /var/lib/mysql/db5/ #查看刪除表空間後的數據庫文件
db.opt  t1.frm  t1.ibd  t2.frm
[root@mysql-50 ~]# innobackupex --user root --password 123456 --apply-log  --databases=”db5” --export  /db5bak/  #導出表信息
[root@mysql-50 ~]# cp /db5bak/db5/t2.{ibd,cfg,exp} /var/lib/mysql/db5/   #拷貝文件
[root@mysql-50 ~]# chown -R mysql:mysql  /var/lib/mysql/db5/t2.* #授權
mysql> alter table db5.t2 import tablespace;  #導入表空間
mysql> select * from db5.t2;   #查看數據庫

4,註意事項
  本次實驗主要以mysql數據備份為主,本文僅供參考,如有技術問題請留言.

mysql數據備份三部曲--jluocc