MySQL學習筆記十二:數據備份與恢復


數據備份

1.物理備份與邏輯備份

物理備份

物理備份就是將數據庫的數據文件,配置文件,日志文件等復制一份到其他路徑上,這種備份速度一般較快,因為只有I/O操作。進行物理備份時,一般都需要關閉mysql服務器,或者對需要備份的對象進行鎖定,要不很容易造成備份的不一致性,恢復時可能會丟失數據。物理備份的方式有很多,如操作系統命令copy(cp),scp,mysqlbackup,以及MyISAM表的mysqlhotcopy。

邏輯備份

邏輯備份是對數據庫的邏輯結構(create database,create table),以及其所存儲的數據(轉換為insert into)進行備份。這種備份非常的靈活,但是對於大型系統來講,邏輯備份進行恢復時性能較低。邏輯備份工具有mysqldump,select...into outfile等。

2.聯機備份與脫機備份

聯機備份又稱熱備份,即在mysql服務器運行時進行備份,脫機備份,即冷備份,在mysql服務器停止運行后進行備份。

熱備份的優點是不會影響其他客戶端訪問mysql服務,仍可以正常讀取數據。但是在進行熱備份時需要發生避免數據的修改操作,以至於影響備份的一致性和完整性。

冷備份的有點是沒有客戶端的連接,直接進行備份即可。但為了降低對業務的影響,盡量在slave端進行備份。

3.完整備份和增量備份

完整備份是對整個數據庫所有的數據進行的備份,而增量備份就是指定時間點后發送的修改,增量備份基於mysql binary log來實現。

4.MyISAM表的物理備份

方法一:先鎖表在復制,示例

mysql> flush tables stu with read lock;
Query OK, 0 rows affected (0.00 sec)

copy "D:\ProgramData\MySQL\MySQL Server 5.5\data\test\t2.*"  f:\backup
D:\ProgramData\MySQL\MySQL Server 5.5\data\test\t2.frm
D:\ProgramData\MySQL\MySQL Server 5.5\data\test\t2.MYD
D:\ProgramData\MySQL\MySQL Server 5.5\data\test\t2.MYI
已復制         3 個文件。

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

方法二:使用mysqlhotcopy命令

Windows平台下使用mysqlhotcopy需要安裝perl以及DBD-MYSQL,DBI模塊,但是呢,mysqlhotcopy命令也是調用操作系統命令(cp,scp)來復制文件,因此在Windows平台下無法使用,故大家可以在Linux平台上實驗。

-----------------------DBD模塊的安裝--------------------
C:\Users\Lenovo>ppm install DBD::mysql
Downloading DBD-mysql-4.029...done
Unpacking DBD-mysql-4.029...done
Generating HTML for DBD-mysql-4.029...done
Updating files in site area...done
  11 files installed
----------------mysqlhotcopy命令使用------------------
C:\Users\Lenovo>mysqlhotcopy.pl -u root -p 123456 test  f:/backup
Flushed 11 tables with read lock (`test`.`b`, `test`.`emp_date`, `test`.`t1`, `test`.`
t2`, `test`.`t3`, `test`.`tb_1`, `test`.`tb_2`, `test`.`tb_3`, `test`.`tb_5`, `test`.`
tb_6`, `test`.`users`) in 1 seconds.
Locked 0 views () in 0 seconds.
Copying 22 files...
------------------在Ubuntu上驗證結果---------------------
root@zhumuxian-machine:/# mysqlhotcopy -u root -p 123456 test /data/mysql/backup
Warning: /usr/bin/mysqlhotcopy is deprecated and will be removed in a future version.
Flushed 1 tables with read lock (`test`.`stu`) in 0 seconds.
Locked 0 views () in 0 seconds.
Copying 4 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 1 tables (4 files) in 0 seconds (0 seconds overall).
root@zhumuxian-machine:/# ls /data/mysql/backup/test

5.使用mysqldump進行邏輯備份

使用mysqldump工具創建的備份集有兩種格式,一是標准的SQL語句,二是定界格式的文件。

備份單個數據庫(可指定具體那個表,在數據庫名后面加上表名即可)

PS C:\Users\Lenovo> mysqldump -u root -p123456 --default-character-set gbk zz > f:\zz.sql

備份多個數據庫

PS F:\> mysqldump -u root -p7758520 --default-character-set gbk --databases zz,test > zztest.sql

備份所有的數據庫(如果有不存在的數據庫,則會報錯)

PS F:\> mysqldump -u root -p7758520 --default-character-set gbk --all-databases > db_all.sql

輸出成定界格式文件

PS F:\> mysqldump -u root -p123456 --default-character-set gbk --tab=f:\mysql_backup --fields-terminated-by ',' --lines-terminated-by '\r\n' zz stu
---------------如果指定的路徑不存在,則會報錯errorCode2-------------------------------------
PS F:\mysql_backup> dir

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2015/4/21      9:18       1482 stu.sql
-a---         2015/4/21      9:18        108 stu.txt

6.恢復mysqldump命令創建的備份,使用MYSQL命令

SQL格式恢復

F:\mysql_backup>mysql -u root -p123456 --default-character-set=utf8  zz < .\zz_stu.sql

定界格式恢復

由於這種備份的分為表對象的備份和其數據的備份,首先將表對象恢復,然后利用LOAD DATA INFILE語句導入表數據。

mysql> drop table stu; --刪除數據庫
Query OK, 0 rows affected (0.00 sec)
---------------------------------------------
F:\mysql_backup>mysql -u root -p123456  --default-character-set=utf8 zz < .\stu.sql
-------------------------------------------------
mysql> show tables;
+--------------+
| Tables_in_zz |
+--------------+
| sql_users    |
| stu          |
| users        |
+--------------+
3 rows in set (0.00 sec)

mysql> select * from stu;
Empty set (0.00 sec)
------------------------------------------------------
mysql> load data infile 'f:/mysql_backup/stu.txt' into table  stu character set gbk fields terminated by ',' lines termi
nated by '\r\n';
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from stu;
+---------+--------+-------+------+--------+
| sno     | sname  | class | age  | gender |
+---------+--------+-------+------+--------+
| 4010404 | 祝小賢 | A1012 |   20 |      1 |
| 4010405 | 肖小傑 | A1013 |   22 |      0 |
| 4010406 | 鍾小喜 | A1014 |   24 |      1 |
| 4010407 | 鍾小惠 | A1015 |   26 |      0 |
+---------+--------+-------+------+--------+
4 rows in set (0.00 sec)
View Code

 7.增量備份的創建

Mysql的增量備份主要借助於二進制日志,因此必須開啟二進制日志功能,可以在配置文件中設置log-bin的參數或者在開啟mysql服務時指定--log-bin參數的值開啟該功能。所謂增量備份就是將冷備份之后生成的二進制日志備份到指定路徑,在需要恢復時,先進行冷備份恢復,再對備份的二進制日志進行分析,然后拿到mysql命令中執行。

分析二進制日志並輸出到SQL文件中

root@zhumuxian-machine:/home/zhumuxian# mysqlbinlog --no-defaults /data/mysql/mysql-bin.000001 > /data/backup/000001.sql

利用mysql命令執行分析得到的SQL文件內容

root@zhumuxian-machine:/data/backup# mysql -u root -p123456 < ./000001.sql 

上面兩條命令可以利用管道合並在一起寫

root@zhumuxian-machine:/home/zhumuxian# mysqlbinlog --no-defaults /data/mysql/mysql-bin.000001 | mysql -u root -p123456

如果執行mysqlbinlog命令時出現類似"unknown variable  default-character-set=utf8" 錯誤時,一般都是客戶端識別不了配置文件的某個變量,解決方法如下:

方法一:在配置文件中,將該變量注釋掉

方法二:執行mysqlbinlog命令時,加上--no-defaults選項

方法三:將變量改為loose-variable-name=xxx(我這里是loose-default-character-set=utf8)

由於mysql二進制日志采用ROW格式記錄,使用base64編碼,幾乎看不懂,可以利用--base64-output選項參數來解決,該參數有三個內置值:none(不做ROW格式處理),decode-rows(解碼處理,一般於-v組合使用),auto(默認,采用ROW格式),例示如下:

-----------------------base64編碼的信息---------------------------
mOA1VQ8BAAAAdAAAAHgAAAAAAAQANS42LjI0LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACY4DVVEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAUNe
----------------------使用decode-rows顯示-------------------------
root@zhumuxian-machine:/data/backup# mysqlbinlog --no-defaults --base64-output=decode-rows -v /data/mysql/mysql-bin.000001

8.第三方聯機備份工具XtraBackup

XtraBackup是一個熱備份工具,支持Innodb,MyISAM,CSV等引擎對象的備份,還是比較流行的。

XtraBackup的安裝:

首先到Percona官網下載最新版的XtraBackup,我使用的是percona-xtrabackup_2.2.10-1.trusty_i386.deb,安裝非常的簡單,只需一條命令即可,如下所示。

root@zhumuxian-machine:/# dpkg -i percona-xtrabackup_2.2.10-1.trusty_i386.deb

查看安裝是否成功

root@zhumuxian-machine:/usr/bin# ls xtra* inno* 
innobackupex innochecksum xtrabackup -----------------或者---------------------- root@zhumuxian-machine:/usr/bin# xtrabackup --version xtrabackup version 2.2.10 based on MySQL server 5.6.22 Linux (i686) (revision id: )

XtraBackup工具提供了兩個命令,xtrabackup與innobackupex。

xtrabackup有兩種模式,backup(備份)與prepare(恢復),並且只能備份Innodb,xtradb引擎對象。

使用xtrabackup命令創建備份

root@zhumuxian-machine:/data/mydata/backup# xtrabackup --defaults-file=/etc/mysql/my.cnf --backup --terget-dir=/data/mydata/backup

上面執行xtrabbackup命令使用了三個參數:

--defaults-files:指定mysql配置文件的路徑,最重要的功能時獲取datadir的值

--backup : 指定為備份

--target-dir:指定保存備份集的路徑

查看備份集的路徑

root@zhumuxian-machine:/# ls /data/mydata/backup/
ibdata1  test                    xtrabackup_checkpoints
mysql    xtrabackup_backupfiles  xtrabackup_logfile

從上面的結果可以看出,xtrabackup只備份數據文件,不會備份表的結構文件(.frm),因此還需手動復制表結構文件。

innobackupex命令,支持多種引擎對象,該命令創建備份,需要連接數據庫,可以創建一個用戶專門用於備份,如下所示。

mysql> create user innobk@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant reload,lock tables,replication client,super on *.* to innobk@'localhost';
Query OK, 0 rows affected (0.00 sec)

使用innobackupex命令創建完整備份,如下所示。

root@zhumuxian-machine:/# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' /data/mydata/backup/

上面命令使用了四個參數:--defaults-file 指定配置文件路徑 --user 用戶名  --password 用戶密碼   [backup_dir] 指定備份集保存的路徑

使用innobackupex創建增量備份

root@zhumuxian-machine:/# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --incremental --incremental-basedir=/data/mydata/backup/2015-04-21_22-18-27 /data/mydata/incremental/

上面創建增量備份的命令中,新增了2個參數:--incremental  指定備份為增量備份  --incremental-basedir 指定增量備份基於的全量備份的路徑。

其實只有Innodb引擎對象才能算是增量備份,因為只有該引擎對象才有LSN(日志序列號),增量備份又是基於LSN來實現的,其它的引擎對象增量備份都是完整備份。

使用innobackupex全量恢復

----------------------應用日志,使數據文件達到一致性----------------
root@zhumuxian-machine:/data/mysql# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --apply-log /data/mydata/backup/2015-04-21_22-18-27/
------------------------執行恢復--------------------------------
root@zhumuxian-machine:/data/mysql# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --copy-back /data/mydata/backup/2015-04-21_22-18-27/

--執行完畢后,查看權限是否正確

使用innobackupex增量恢復

-------------------------應用日志------------------------
root@zhumuxian-machine:/data/mysql# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --apply-log --redo-only /data/mydata/backup/2015-04-21_22-18-27/
//有增量備份必須指定--redo-only參數,強制xtrabackup只進行redo而不進行回滾
------------------------應用增量備份----------------------
root@zhumuxian-machine:/data/mysql# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --apply-log  /data/mydata/backup/2015-04-21_22-18-27/ --incremental-dir=/data/mydata/incremental/2015-04-21_22-33-40/
----------------------------回滾-------------------------
root@zhumuxian-machine:/data/mysql# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --apply-log  /data/mydata/backup/2015-04-21_22-18-27/
----------------------------拷貝-------------------------
root@zhumuxian-machine:/data/mysql# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --copy-back  /data/mydata/backup/2015-04-21_22-18-27/

使用innobackupex打包和壓縮備份集,可以使用--stream參數來指定流格式,只支持tar,xbstream。

root@zhumuxian-machine:/tmp# innobackupex --defaults-file=/etc/mysql/my.cnf --user=innobk --password='123456' --stream=tar /tmp | gzip > /data/mydata/backup/bk.tar.gz
//流格式輸出數據會臨時保存在/tmp目錄下,然后利用管道保存在指定路徑,解壓時需要使用-i參數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM