欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

關系型數(shù)據庫之Mysql備份(五)

二進制日志簡要:

專注于為中小企業(yè)提供成都網站建設、成都做網站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)新化免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現(xiàn)規(guī)模擴充和轉變。

二進制日志通常作為備份的重要資源,所以再說備份之前我們來回顧下前面專題講過的二進制日志內容。

1.二進制日志內容

引起MySQL服務器改變的任何操作。

復制功能依賴于此日志。

從服務器通過主服務器的二進制日志完成主從復制,在執(zhí)行之前保存于中繼日志中。

從服務器通??梢躁P閉二進制日志以提升性能。

2.二進制文件的格式表現(xiàn)形式:

默認在安裝目錄下,存在mysql-bin.000001,mysql-bin.00002的二進制文件

另外還有mysql-bin.index用來記錄被mysql管理的二進制文件列表

如果需要刪除二進制日志時,切勿直接二進制文件,這樣會導致mysql管理混亂。

3.二進制文件查看相關mysql命令。

#> SHOW MASTER STATUS;查看正在使用的二進制文件

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000007 |    22094 |              |                  |
+------------------+----------+--------------+------------------+

#> FLUSH LOGS;手動滾動二進制日志

mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 |      107 |              |                  |
+------------------+----------+--------------+------------------+
#滾動以后,mysql重新創(chuàng)建一個新的日志mysql-bin.000008

#> SHOW BINARY LOGS 顯示使用過的二進制日志文件。

mysql> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       126 |
| mysql-bin.000002 |      2576 |
| mysql-bin.000003 |       126 |
| mysql-bin.000004 |       126 |
| mysql-bin.000005 |       126 |
| mysql-bin.000006 |       126 |
| mysql-bin.000007 |     22137 |
| mysql-bin.000008 |       107 |
+------------------+-----------+

#> SHOW BINLOG EVENTS;以表的形式查看二進制文件

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] 
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000001' \G;
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 107
       Info: Server ver: 5.5.33-log, Binlog ver: 4

4.MySQL二進制日志文件讀取工具mysqlbinlog

Usage: mysqlbinlog [options] log-files            
     --start-datetime
     --stop-datetime
     --start-position
     --stop-position

截取指定位置的日志記錄

# mysqlbinlog --start-position 15642 --stop-position 15643 /mydata/data/mysql-bin.000001
--截取結果如下:
# at 15642
#160612 16:56:52 server id 1  end_log_pos 15760     Query    thread_id=6    exec_time=0    error_code=0
use `hellodb`/*!*/;
根據以上截取結果第二行,進行解釋二進制日志內容            
     1)時間點: 160612 16:56:52
     2)服務器ID: server id 1 服務器ID主要用于標記日志產生的服務器,主要用于雙主模型中,互為主從,確保二進制文件不會被相互循環(huán)復制
     3)記錄類型: Query  
     4)線程號: thread_id = 6 
     5)語句的時間戳和寫入二進制日志文件的時間差; exec_time=0 
     6)事件內容
     7)事件位置 #at 15642 
     8)錯誤代碼 error_code=0 
     9)事件結束位置 end_log_pos也就是下一事件開始的位置

5.二進制日志格式

由bin_log_format={statement|row|mixed}定義

1)statement:基于語句,記錄生成數(shù)據的語句

#缺點在于如果當時插入信息為函數(shù)生成,有可能不同時間點執(zhí)行結果不一樣。

例如:

mysql > INSERT INTO tb1 VALUE(CURRENT_DATE());

2)row:基于行數(shù)據

缺點在于,有時候數(shù)據量會過大

3)mixed:混合模式,又mysql自行決定何時使用statement,何時使用row模式

6.二進制相關參數(shù)總結:

1)log_bin = {ON|OFF} 還可以是個文件路徑,主要用于控制全局binlog的存放位置和是否開啟

2)log_bin_trust_function_creators 是否記錄在

3)sql_log_bin = {ON|OFF} 會話級別是否關閉binlog, 如果關閉當前會話內的操作將不會記錄

4)sync_binlog 是否馬上同步事務類操作到二進制日志中

5)binlog_format = {statement|row|mixed} 二進制日志的格式,上面單獨提到了

6)max_binlog_cache_size = 二進制日志緩沖空間大小,僅用于緩沖事務類的語句;

7)max_binlog_stmt_cache_size = 語句緩沖,非事務類和事務類共用的空間大小

8)max_binlog_size = 二進制日志文件上限,超過上限后則滾動

9)刪除二進制日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

刪除二進制日志例:

mysql> PURGE BINARY LOGS TO 'mysql-bin.000001';
mysql> PURGE BINARY LOGS BEFORE '2016-06-12 00:00:00';

Tips:切勿將二進制日志與數(shù)據文件放在同一設備及同一目錄下。

二進制日志備份與恢復:

為什么要做備份:

1.災難恢復

2.審計,數(shù)據庫在過去某一個時間點是什么樣的

3.測試

備份目的是什么呢?

1.用于恢復,例如:數(shù)據誤刪除、數(shù)據庫損壞。

2.備份結束后,需要周期性的做恢復測試,以便保證備份的數(shù)據的完整。

備份類型:

1.根據備份時,服務器是否在線

1)冷備(cold backup): 服務器離線,讀寫操作都不能進行

2)溫備份:全局施加鎖共享鎖,只能讀不能寫

3)熱備(hot backup):數(shù)據庫在線,讀寫照樣進行

2.根據備份時的數(shù)據集分類

1)完全備份(full backup)

2)部分備份(partial backup)

3.根據備份時的接口

1)物理備份(physical backup):直接賦值數(shù)據文件,打包歸檔

特點:

不需要額外工具,直接歸檔命令即可,但是可以跨平臺能比較差,如果數(shù)據量超過幾十個G,則使用于物理備份

2)邏輯備份(logical backup): 把數(shù)據抽取保存在sql腳本中

特點:

可以使用文本編輯器編輯

導入方便,直接讀取sql語句即可;

邏輯備份恢復時間慢,占據空間大;

無法保證浮點數(shù)的精度;

恢復完數(shù)據庫后需要重建索引;

4.根據備份整個數(shù)據還是變化數(shù)據

1)完全備份 full backup

2)增量備份 incremental backup

在不同時間點起始備份一段數(shù)據

比較節(jié)約空間

3)差異備份 differential backup

5.備份策略,需要考慮因素如下:

備份方式

備份實踐

備份成本

鎖時間

時長

性能開銷

恢復成本

恢復時長

可以容忍丟失的數(shù)據量

6.備份內容

1)數(shù)據庫中的數(shù)據

2)配置文件

3)mysql中的代碼:存儲過程,存儲函數(shù),觸發(fā)器

4)OS相關的配置文件,crontab中的備份策略腳本

5)如果是主從復制的場景中:跟復制相關的信息

6)二進制日志文件需要定期備份,一旦發(fā)現(xiàn)二進制文件出現(xiàn)問題,需要馬上對數(shù)據進行完全備份。

7.常用的備份工具

1)mysqldump:邏輯備份工具

innodb:熱備,溫備

MyISAM,Aria:溫備

單線程備份恢復比較慢

2)mysqldumper:多線程的mysqldump

3)vm-snapshot:

接近于熱備的工具:因為要先請求全局鎖,而后創(chuàng)建快照,并在創(chuàng)建快照完成后釋放全局鎖;

使用cp、tar等工具進行物理備份

備份與恢復速度較快

但是很難實現(xiàn)增量備份,并且請求全局需要等待一段時間,在繁忙的服務器上尤其如此;

4)通過查詢語句備份數(shù)據:

mysql > SELECT * FROM tb1 INTO OUTFILE '/path/to/somefile';    --導出查詢數(shù)據為文本文件
mysql > LOAD DATA INFILE '/path/from/somefile';                --導入文本文件至數(shù)據庫中
部分備份工具,不會備份關系定義,僅備份表中的數(shù)據;
邏輯備份鞏固,快于mysqldump,因為不備份表格式信息

5)Innobase:商業(yè)備份工具,innobackup

InnoDB熱備,增量備份

MyISAM溫備,不支持增量,只有完全備份

屬于物理備份,速度快;

6)Xtrabackup:由Percona提供的開源備份工具

InnoDB熱備,增量備份;

MyISAM溫備,不支持增量;

7)mysqlhotcopy:接近冷備,基本不使用。

mysqldump工具基本使用

1.mysqldump [OPTIONS] database [tables....]

還原庫時數(shù)據庫必須存在,不存在需要手動創(chuàng)建

--all-databases: 備份所有庫    
    --databases db1 db2 ...: 備份指定的多個庫,如果使用此命令,恢復時將不用手動創(chuàng)建庫
    --lock-all-tables:請求鎖定所有表之后再備份,對MyISAM、InnoDB、Aria做溫備
    --lock-table: 對正在備份的表加鎖,但是不建議使用,如果其它表被修改,則備份后表與表之間將不同步
    --single-transaction: 能夠對InnoDB存儲引擎實現(xiàn)熱備;
    啟動一個很大的大事物,基于MOCC可以保證在事物內的表版本一致
    自動加鎖不需要,再加--lock-table, 可以實現(xiàn)熱備
備份代碼:
    --events: 備份事件調度器代碼
    --routines: 備份存儲過程和存儲函數(shù)
    --triggers:備份觸發(fā)器
備份時滾動日志:
    --flush-logs: 備份前、請求到鎖之后滾動日志;
    方恢復備份時間點以后的內容
復制時的同步位置標記:主從架構中的,主服務器數(shù)據。效果相當于標記一個時間點。
    --master-data=[0|1|2]
    0:不記錄
    1:記錄為CHANGE MASTER語句
    2:記錄為注釋的CHANGE MASTER語句

2.使用mysqldump備份簡要過程如下:

1)請求鎖:-lock-all-tables或使用-singe-transaction進行innodb熱備;

2)滾動日志: -flush-logs

3)選定要備份的數(shù)據庫:-databases

4)記錄二進制日志文件及位置:-master-data=

mysql > FLUSH TABLES WITH READ LOCK;

3.恢復:

恢復過程無需寫到二進制日志中

Tips:關閉二進制日志,關閉其他用戶連接;

4.備份策略:基于mysqldump

備份:mysqldump+二進制日志文件;

周日做一次完全備份:備份的同時滾動日志

周一至周六:備份二進制日志;

恢復:

完全備份+各二進制日志文中至此刻的事件

5.二進制備份恢復使用案例

1)完全備份mysql數(shù)據庫,并實現(xiàn)還原

備份之前的數(shù)據庫及數(shù)據情況

mysql> SHOW DATABASES;    --查詢當前數(shù)據庫服務器下所有的數(shù)據庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
--開啟mysql二進制日志功能
# vim /etc/my.cnf 
[server]
log-bin=/mydata/data/mysql-bin
--修改配置文件后重啟mysql服務
# service mysqld restart
--經安全考慮在備份的時候最好不要使用管理員賬號操作,所以需要創(chuàng)建一個專門的用戶用來做mysqldump備份
mysql> GRANT SELECT,SHOW DATABASES,LOCK TABLES,RELOAD,EVENT,SUPER ON *.* TO 'sqldump'@'172.16.100.%' IDENTIFIED BY 'sqldum';

然后使用mysqldump進行備份

# mysqldump --events --master-data=2 --all-databases --lock-all-tables --flush-logs -usqldump -h272.16.100.7 -psqldump > /tmp/all_dump_bak.sql
以上賦予sqldump用戶權限對應分析:
SHOW DATABASES --> --all-databases
LOCK TABLES --> --lock-all-tables
RELOAD ---> --flush-logs
EVENT ---> --events
SUPER ---> --master-data 主要授予SHOW MASTER STATUS權限

在hellodb.students表中插入一行,再刪除hellodb庫,然后再恢復
mysql> INSERT hellodb.students (Name,Age,Gender) VALUE ('Samlee GZ',28,'M');
mysql> DROP DATABASE hellodb;

恢復:
此時需要關閉session級別的二進制日志功能,恢復內容不記錄日志
mysql> SET SESSION sql_log_bin='OFF';
mysql> SOURCE /tmp/all_dump_bak.sql;

此時數(shù)據庫恢復到,插入Samlee GZ 這一行之前的數(shù)據,然后通過二進制日志恢復直到數(shù)據庫被刪除之前的內容
由于設置了--master-data選項,所以在備份文件中可以找到如下一行
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=107;
這一行標記了新的二進制文件從那個點起始,通過查看二進制日志mysql_bin.000010可以得知,還需要恢復107到340也就是hellodb被刪除之前的數(shù)據
# mysqlbinlog --start-position 107 --stop-position 340 /mydata/data/mysql-bin.000010 > /tmp/binlog107_340.sql
mysql> SOURCE /tmp/binlog107_340.sql;
mysql> SELECT * FROM hellodb.students;--查詢我們可以看到最后一行是自己插入的數(shù)據
|    26 | Samlee GZ     |  28 | M      |    NULL |      NULL |

2)使用shell腳本自動定時備份--mysqldump方式:

腳本內容如下:

#!/bin/bash
#
## Using mysqldump to backup the all databases
function backup {
    prefix=$1
    outputdir=$2
    [ -d $outputdir ] || (echo "No output dir,create one!" && mkdir -p $outputdir)
    now=`/bin/date +'%Y_%b_%d_%k%M'`
    mysqldump='/usr/local/mysql/bin/mysqldump'
    mysqldump --events -master-data=2 --all-databases --single-transaction --flush-logs -usqldump -h272.16.100.7 -psqldump > $outputdir/${prefix}_${now}.sql
}
function main {
    case $# in
    2)
    backup $1 $2
    ;;
    *)
    echo 'Usage: ./mysqldump_backup.sh prefix outputdir'
    ;;
    esac
}
main $*
You have new mail in /var/spool/mail/root

設置周期任務計劃表

# crontab -e            
* * * * * /usr/local/mysql/bin/mysqldump_backup.sh back /tmp/mysqlback
# ll /tmp/mysqlback/    --實現(xiàn)每分鐘備份一次
-rw-r--r-- 1 root root 0 Jun 14 11:13 back_2016_Jun_14_1113.sql
-rw-r--r-- 1 root root 0 Jun 14 11:14 back_2016_Jun_14_1114.sql
-rw-r--r-- 1 root root 0 Jun 14 11:15 back_2016_Jun_14_1115.sql
-rw-r--r-- 1 root root 0 Jun 14 11:16 back_2016_Jun_14_1116.sql
-rw-r--r-- 1 root root 0 Jun 14 11:17 back_2016_Jun_14_1117.sql
-rw-r--r-- 1 root root 0 Jun 14 11:18 back_2016_Jun_14_1118.sql
-rw-r--r-- 1 root root 0 Jun 14 11:19 back_2016_Jun_14_1119.sql
-rw-r--r-- 1 root root 0 Jun 14 11:20 back_2016_Jun_14_1120.sql

lvm-snapshot:基于LVM快照的備份

關于快照:

1.事務日志跟數(shù)據文件必須在同一個卷上;

2.剛剛創(chuàng)立的快照卷,里面沒有任何數(shù)據,所有的數(shù)據均來源于原卷

3.一旦員卷數(shù)據發(fā)生修改,修改的數(shù)據將復制到快照卷中,此時訪問數(shù)據-部分來自于快照卷,一部分來自于原卷

4.當快照使用過程中,如果修改的數(shù)據量大于快照卷容量,則會導致快照卷崩潰。

5.快照卷本身不是備份,只是提供一個實踐一致性的訪問目錄。

基于快照備份幾乎為熱備:

1.創(chuàng)建快照卷之前,要請求MySQL的全局鎖;在快照創(chuàng)建完成之后釋放鎖;

2.如果是Innodb引擎,當flush tables后會有一部分保存在事務日志中,卻不在文件中。因此恢復時候,需要事務日志和數(shù)據文件

但是釋放鎖以后,事務日志的內容會同步數(shù)據文件中,因此備份內容并不絕對是鎖釋放時刻的內容,由于有些未完成的事務已經完成,但在備份數(shù)據中因為沒有完成而回滾。因此需要借助二進制日志往后走一段。

基于快照備份的注意事項:

1.事務日志跟數(shù)據文件必須在同一個卷中;

2.創(chuàng)建快照卷之前,要請求MySQL的全局鎖;在快照創(chuàng)建完成之后釋放鎖;

3.請求全局鎖完成之后,做一次日志滾動;做二進制日志文件及位置標記(手動進行);

備份與恢復的簡要步驟如下:

備份

1.請求全局鎖,并滾動日志

mysql > FLUSH TABLES WITH READ LOCK;
mysql > FLUSH LOGS;

2.生成二進制日志文件及位置標記(手動進行)

# mysql -e 'SHOW MASTER STATUS' > /path/to/orignal_volume

3.創(chuàng)建快照卷

# lvcreate -L -s -n -p r /path/to/some_lv

4.釋放全局鎖

5.掛載快照卷并備份

6.備份完成之后,刪除快照卷

恢復:

1.二進制日志保存好;

提取備份之后的所有事件至某sql腳本中

2.還原數(shù)據,修改權限及屬主屬組等,并啟動mysql

3.做即時點還原

4.生產環(huán)境下,一次大型恢復后,需要馬上進行一次完全備份。

使用快照卷備份恢復mysql實例:

環(huán)境,實現(xiàn)創(chuàng)建一個myvg的卷組,mydata邏輯卷用來存儲mysql數(shù)據,掛載至/mydata/data

備份:

1.創(chuàng)建備份專用的賬號,授予權限FLUSH LOGS和LOCK TABLES

mysql> GRANT RELOAD,LOCK TABLES,SUPER ON *.* TO 'lvm'@'172.16.100.%' IDENTIFIED BY 'lvm';

mysql> FLUSH PRIVILEGES;

2.請求全局鎖,鎖定數(shù)據庫并且滾動日志

mysql > FLUSH TABLES WITH READ LOCK;

mysql > FLUSH LOGS;

3.記錄備份點

# mysql -ulvm -h272.16.100.7 -plvm -e 'SHOW MASTER STATUS' > /tmp/backp_point.txt
# cat /tmp/backp_point.txt
File    Position    Binlog_Do_DB    Binlog_Ignore_DB
mysql-bin.000010    499

4.創(chuàng)建快照卷并掛載快照卷及創(chuàng)建備份文件提取點

# lvcreate -L 100M -s -n mydata-snap -p r /dev/myvg/mydata 
# mount -t ext4 -o ro /dev/myvg/mydata-snap /mnt/
#  mkdir /backups

5.釋放鎖

# mysql -ulvm -h272.16.100.7 -plvm -e 'UNLOCK TABLES';
## 模擬寫入操作
mysql> UNLOCK TABLES;
mysql> CREATE DATABASE samleedb;

6.復制快照里面文件至備份文件存儲目錄

# cp -ar /mnt/data/ /backups/data-2016-06-14

7.備份完成,刪除快照卷,減少磁盤I/O

# umount /mnt/
# lvremove /dev/myvg/mydata-snap

故障模擬恢復: 數(shù)據庫存儲目錄損壞或整個服務器崩潰,并且數(shù)據存儲目錄全部被刪除

1.模擬數(shù)據損壞故障:

[root@mysql ~]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]
[root@mysql ~]# rm -rf /mydata/data/*
[root@mysql ~]# service mysqld start
Starting MySQL....The server quit without updating PID file[FAILED]a/data/mysql.samlee.com.pid).
--此時發(fā)現(xiàn)mysql無法啟動了

2.將備份的數(shù)據文件復制回源目錄再啟動mysql

# cp -arp /backups/data-2016-06-14/* /mydata/data/
# service mysql start
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| samlee             |
| test               |
+--------------------+
此時顯示沒有samleedb,因為這個是備份之后創(chuàng)建的,因此需要通過之前記錄的二進制日志位置還原

3.查看之前記錄的記錄點。向后還原

# cat /tmp/backp_point.txt 
File    Position    Binlog_Do_DB    Binlog_Ignore_DB
mysql-bin.000010    499    
# mysqlbinlog /mydata/data/mysql-bin.000010 --start-position 499 > /tmp/2016_06_14.sql
mysql> source /tmp/2016_06_14.sql;
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| samlee             |
| test               |
| samleedb             |
+--------------------+

使用Xtrabackup進行MySQL備份

安裝:

1.簡介

  Xtrabackup是percona提供的mysql數(shù)據庫備份工具,據官方介紹,這也是世界上唯一一款開源的能夠對innodb和xtradb數(shù)據庫進行熱備的工具。特點:

1)備份過程快速、可靠;

2)備份過程不會打斷正在執(zhí)行的事務;

3)能夠基于壓縮等功能節(jié)約磁盤空間和流量;

4)自動實現(xiàn)備份校驗;

5)還原速度快;

2.安裝及安裝源獲取

其最新版本可以從以下URL獲得:

https://www.percona.com/downloads/XtraBackup/

安裝

# yum -y install  percona-toolkit-2.2.16-1.noarch.rpm 
# yum -y install  libev-4.15-1.el6.rf.x86_64.rpm
# yum -y install  percona-xtrabackup-2.3.2-1.el6.x86_64.rpm

備份實現(xiàn):

1.完全備份:

如果要使用一個最小權限的用戶進行備份,則可基于如下命令創(chuàng)建此類用戶:

Usage: innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
--user:需要創(chuàng)建一個擁有最小權限的用戶
mysql> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'xtrauser'@'localhost' IDENTIFIED BY 'xtrauser';
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'xtrauser';
mysql> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'xtrauser'@'localhost';
mysql> FLUSH PRIVILEGES;

/path/to/BACKUP_DIR:備份出來的數(shù)據存儲目錄,外加包含一些xtrabackup的元數(shù)據

使用innobackupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關于表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發(fā)器和數(shù)據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中。

示例:備份

# innobackupex --user=xtrauser --password=xtrauser /tmp/xtrabackup/
160615 09:47:34 Executing UNLOCK TABLES
160615 09:47:34 All tables unlocked
160615 09:47:34 Backup created in directory '/tmp/xtrabackup//2016-06-15_09-47-27'
MySQL binlog position: filename 'mysql-bin.000011', position '655'
160615 09:47:34 [00] Writing backup-my.cnf
160615 09:47:34 [00]        ...done
160615 09:47:34 [00] Writing xtrabackup_info
160615 09:47:34 [00]        ...done
xtrabackup: Transaction log of lsn (1604789) to (1604789) was copied.
160615 09:47:35 completed OK!

看到最后一行的時候,說明備份已經完成。


在備份的同時,innobackupex還會再備份目錄中創(chuàng)建如下文件:

(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(tài)(如是否已經為prepared狀態(tài))和LSN(日志序列號)范圍信息;

# cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 1604789
last_lsn = 1604789
compact = 0
recover_binlog_info = 0

每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數(shù)據庫系統(tǒng)的系統(tǒng)版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發(fā)生改變的

在mysql中,存儲數(shù)據的數(shù)據塊會有按照順序的ID,如果某一塊數(shù)據被修改,將會賦予新的ID。根據這些ID,可以標記數(shù)據的新老程度。xtrabackup也就是使用這些ID來進行備份,和增量備份。

2.xtrabackup_binlog_info: mysql服務器當前正在使用的二進制日志文件及至備份這 一刻位置二進制日志事件的位置。

# cat xtrabackup_binlog_info 
mysql-bin.000011    655

3. xtrabackup_info: 包含很多xtrabackup工具信息以及所備份的數(shù)據庫信息

# cat xtrabackup_info 
uuid = 21c7cde7-329b-11e6-b888-000c2923351b
name = 
tool_name = innobackupex
tool_command = --user=xtrauser --password=... /tmp/xtrabackup/
tool_version = 2.3.2
ibbackup_version = 2.3.2
server_version = 5.5.33-log
start_time = 2016-06-15 09:47:31
end_time = 2016-06-15 09:47:34
lock_time = 0
binlog_pos = filename 'mysql-bin.000011', position '655'
innodb_from_lsn = 0
innodb_to_lsn = 1604789
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N

4.backup-my.cnf —— 備份命令用到的配置選項信息

# cat backup-my.cnf 
# This MySQL options file was generated by innobackupex.

# The MySQL server
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=5242880
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0

5.xtrabackup_binlog_pos_innodb —— 二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創(chuàng)建一個以時間命名的目錄;如此一來,innobackupex命令將會創(chuàng)建一個BACKUP-DIR目錄來存儲備份數(shù)據。

準備(prepare)一個完全備份

一般情況下,在備份完成后,數(shù)據尚且不能用于恢復操作,因為備份的數(shù)據中可能會包含尚未提交的事務或已經提交但尚未同步至數(shù)據文件中的事務。

因此,此時數(shù)據文件仍處理不一致狀態(tài)。"準備"的主要作用正是通過回滾未提交的事務及同步提交的事務至數(shù)據文件也使得數(shù)據文件處于一致性狀態(tài)。

innobackupex命令的-apply-log選項可用于實現(xiàn)上述功能。如下面的命令:實際上就是把未完成的事務提交,準備工作需要在還原之前才執(zhí)行,在這之前都能執(zhí)行準備工作。

Usage:innobackupex --apply-log /path/to/BACKUP-DIR
示例:
# innobackupex --apply-log /tmp/xtrabackup/2016-06-15_09-47-27/
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1605142
160615 10:26:54 completed OK!
看到這幾行說明已經完成"準備"
在實現(xiàn)"準備"的過程中,innobackupex通常還可以使用--use-memory選項來指定其可以使用的內存大小,默認通常為100M。如果有足夠的內容可用,可以多劃分一些內存給prepare的過程使用,以提高其完成速度。


從一個完全備份中恢復數(shù)據

注意:恢復不用啟動MySQL
innobackupex命令的--copy-back選項用于執(zhí)行恢復操作,其通過復制所有數(shù)據相關的文件至mysql服務器DATADIR目錄中來執(zhí)行恢復過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。

usage:innobackupex --copy-back  /path/to/BACKUP-DIR
# innobackupex --copy-back /tmp/xtrabackup/2016-06-15_09-47-27/
如果執(zhí)行正確,其輸出信息的最后幾行通常如下:
160615 10:46:34 [01]        ...done
160615 10:46:34 completed OK!

當數(shù)據恢復至DATADIR目錄以后,還需要確保所有數(shù)據文件的屬主和屬組均為正確的用戶,如mysql,否則,在啟動mysqld之前還需要事先修改數(shù)據文件的屬主和屬組。

# chown -R mysql:mysql /mydata/data/
# service mysqld start


使用innobackupex進行增量備份

            每個InnoDB的頁面都會包含一個LSN信息,每當相關的數(shù)據發(fā)生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之后發(fā)生改變的頁面來實現(xiàn)。

        1. 備份過程: 

            要實現(xiàn)第一次增量備份,可以使用下面的命令進行:

usage: innobackupex –incremental /backup –incremental-basedir=BASEDIR
BASEDIR:指的是完全備份所在的目錄,
此命令執(zhí)行結束后,innobackupex命令會在/backup目錄中創(chuàng)建一個新的以時間命名的目錄以存放所有的增量備份數(shù)據。另外,在執(zhí)行過增量備
份之后再一次進行增量備份時,其–incremental-basedir應該指向上一次的增量備份所在的目錄。

                需要注意的是,增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言,執(zhí)行增量備份時其實進行的是完全備份。


增量備份恢復案例應用:

首先做一次完全備份,在之前完全備份的基礎上做兩次增量備份,之間創(chuàng)建兩個數(shù)據庫。

完全備份:

# innobackupex --user=xtrauser --password=xtrauser --no-timestamp /tmp/xtrabackup/full_backup
--創(chuàng)建測試數(shù)據庫
mysql> CREATE DATABASE samlee1;

第一次增量備份:

# innobackupex --user=xtrauser --password=xtrauser --incremental /tmp/xtrabackup/ --incremental-basedir=/tmp/xtrabackup/full_backup/
mysql> CREATE DATABASE samlee2;

第二次增量備份:

# innobackupex --user=xtrauser --password=xtrauser --incremental /tmp/xtrabackup/ --incremental-basedir=/tmp/xtrabackup/2016-06-15_13-26-08/

2. 準備過程

準備”(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:

1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”?!爸胤拧敝?,所有的備份數(shù)據將合并到完全備份上。

2)基于所有的備份將未提交的事務進行“回滾”。于是,操作就變成了:不能回滾,因為有可能第一次備份時候沒提交,在增量中已經成功提交

使用方法如下:

# innobackupex --apply-log --redo-only BASE-DIR

接著執(zhí)行:

 # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

而后就是第二個增量

 # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

這樣一個個準備完成后,所有增量備份將合并至完全備份中。

其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執(zhí)行如上操作;

示例:

# innobackupex --apply-log --redo-only /tmp/xtrabackup/full_backup
# innobackupex --apply-log --redo-only /tmp/xtrabackup/full_backup/ --incremental-dir=/tmp/xtrabackup/2016-06-15_13-26-08
# innobackupex --apply-log --redo-only /tmp/xtrabackup/full_backup/ --incremental-dir=/tmp/xtrabackup/2016-06-15_13-28-42/

 3. 恢復過程:與完全備份類似,直接copy-back完全備份的那個目錄。 此時所有的增量已經正好到完全備份的目錄中

# service mysqld stop
# rm -rf /mydata/data/*
# innobackupex --copy-back /tmp/xtrabackup/full_backup/
# chown -R mysql:mysql /mydata/data
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| samlee             |
| samlee1            |
| samlee2            |
| test               |
+--------------------+
可以看到我們前面創(chuàng)建的兩個數(shù)據庫都已經恢復成功了。

Xtrabackup的“流”及“備份壓縮”功能

            Xtrabackup對備份的數(shù)據文件支持“流”功能,即可以將備份的數(shù)據通過STDOUT傳輸給tar程序進行歸檔,而不是默認的直接保存至某備份目錄中。要使用此功能,僅需要使用–stream選項即可。如:

Usage: innobackupex –stream=tar  /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz

示例:

# innobackupex --user=xtrauser --password=xtrauser --stream=tar /tmp/xtrabackup/ | gzip > /tmp/xtrabackup/`date +%F_%H-%M-%S`.tar.gz

甚至也可以使用類似如下命令將數(shù)據備份至其它服務器:

# innobackupex --stream=tar  /backup | ssh user@www.samlee.com  "cat -  > /backups/`date +%F_%H-%M-%S`.tar"

此外,在執(zhí)行本地備份時,還可以使用--parallel選項對多個文件進行并行復制。此選項用于指定在復制時啟動的線程數(shù)目。當然,在實際進行備份時要利用此功能的便利性,也需要啟用innodb_file_per_table選項或共享的表空間通過innodb_data_file_path選項存儲在多個ibdata文件中。對某一數(shù)據庫的多個文件的復制無法利用到此功能。其簡單使用方法如下:

# innobackupex --parallel  /path/to/backup

同時,innobackupex備份的數(shù)據文件也可以存儲至遠程主機,這可以使用--remote-host選項來實現(xiàn):

# innobackupex --remote-host=root@www.samlee.com  /path/IN/REMOTE/HOST/to/backup

 導入或導出單張表

            默認情況下,InnoDB表不能通過直接復 制表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現(xiàn)此 種功能,不過,此時需要“導出”表的mysql服務器啟用了innodb_file_per_table選項(嚴格來說,是要“導出”的表在其創(chuàng)建之 前,mysql服務器就啟用了innodb_file_per_table選項),并且“導入”表的服務器同時啟用了 innodb_file_per_table和innodb_expand_import選項。

        在創(chuàng)建數(shù)據庫之前,在配置文件中server段下面寫入innodb_file_per_table=1

1) “導出”表

導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在prepare過程中通過–export選項將某表導出了:

Usage: innobackupex –apply-log –export /path/to/backup

示例:

# innobackupex --user=xtrauser --password=xtrauser /tmp/xtrabackup/
# innobackupex --apply-log --export /tmp/xtrabackup/2016-06-15_14-45-06/
--此命令會為每個innodb表的表空間創(chuàng)建一個以.exp結尾的文件,這些以.exp結尾的文件則可以用于導入至其它服務器。
# ls /tmp/xtrabackup/2016-06-15_14-45-06/hellodb/*.exp
classes.exp  students.exp    scores.exp    toc.exp
coc.exp      teachers.exp    courses.exp

2 )“導入”表

使用show CREATE TABLE mytable; 來查看原始表創(chuàng)建命令 

要在mysql服務器上導入來自于其它服務器的某innodb表,需要先在當前服務器上創(chuàng)建一個跟原表表結構一致的表,而后才能實現(xiàn)將表導入:

事例: 這里以students 表為例:

mysql> SHOW CREATE TABLE hellodb.students \G
*************************** 1. row ***************************
       Table: students
Create Table: CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
1 row in set (0.02 sec)
在samlee庫中創(chuàng)建這個表:
mysql> CREATE TABLE `students` (
    ->   `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `Name` varchar(50) NOT NULL,
    ->   `Age` tinyint(3) unsigned NOT NULL,
    ->   `Gender` enum('F','M') NOT NULL,
    ->   `ClassID` tinyint(3) unsigned DEFAULT NULL,
    ->   `TeacherID` int(10) unsigned DEFAULT NULL,
    ->   PRIMARY KEY (`StuID`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
    
 然后將此表的表空間刪除:
 mysql> ALTER TABLE samlee.students DISCARD TABLESPACE;
 接下來,將來自于“導出”表的服務器的students表的students.ibd和students.exp文件復制到當前服務器的數(shù)據目錄,然后使用如下命令將其“導入”:    
 ##注意權限
# cp /tmp/xtrabackup/2016-06-15_14-45-06/hellodb/students{.ibd,.exp} /mydata/data/samlee/
# chown mysql.mysql /mydata/data/samlee/students.*
mysql> ALTER TABLE samlee.students IMPORT TABLESPACE;

備份注意:

        1. 將數(shù)據和備份放在不同的磁盤設備上;異機或異地備份存儲較為理想;

        2. 備份的數(shù)據應該周期性地進行還原測試;

        3. 每次災難恢復后都應該立即做一次完全備份;

        4. 針對不同規(guī)模或級別的數(shù)據量,要定制好備份策略;

        5. 二進制日志應該跟數(shù)據文件在不同磁盤上,并周期性地備份好二進制日志文件;

從備份中恢復應該遵循步驟:

        1. 停止MySQL服務器;

        2. 記錄服務器的配置和文件權限;

        3. 將數(shù)據從備份移到MySQL數(shù)據目錄;其執(zhí)行方式依賴于工具;

        4. 改變配置和文件權限;

        5. 以限制訪問模式重啟服務器;mysqld的–skip-networking選項可跳過網絡功能;

            方法:編輯my.cnf配置文件,添加如下項:

            skip-networking

            socket=/tmp/mysql-recovery.sock

        6. 載入邏輯備份(如果有);而后檢查和重放二進制日志;

        7. 檢查已經還原的數(shù)據;

        8. 重新以完全訪問模式重啟服務器;

            注釋前面在my.cnf中添加的選項,并重啟;

本文標題:關系型數(shù)據庫之Mysql備份(五)
路徑分享:http://aaarwkj.com/article14/pjccge.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號、動態(tài)網站、用戶體驗、網站設計、品牌網站制作、網站維護

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站
久久精品国产成人综合| 六月综合激情丁香婷婷色| 亚洲香蕉av在线一区二区三区| 日本道二区视频中文字幕| 99久久免费中文字幕| 韩国av在线免费观看| 夫妻性生活在线视频一级片 | 国产老太婆精品久久久久| 日韩精品国产专区一区| 国产原创av剧情在线观看| 午夜欧美激情在线视频| av国产一区二区在线| 成人午夜福利视频免费观看| 综合激情网激情五月天| 亚洲一区二区精品自拍| 成年人免费视频网站国产| 天天操夜夜操白天操晚上操| 日韩一级黄色片在线播放| 香蕉视频在线观看亚洲精品| 日韩中文免费av一区| 日本少妇三级网站大全| 亚洲人成网站18禁止人 | 九九热视频在线观看色| 亚洲国产精品视频中文字幕| 亚洲国产精品激情在线| 亚洲一区二区精品欧美日韩| 少妇熟女视频一区二区三区| 一级丰满少妇av大片| 国产一级二级三级亚洲| 日韩精品视频播放一区| 亚洲精品在线播放av| 女人的天堂av免费在线观看| 国产精品无卡无在线播放| 91人妻精品一区二区| 亚洲天堂av日韩在线| 亚洲欧美日韩1区2区| 97超碰国产在线观看| 九九视频在线观看免费专区| 国产又粗又长又猛又爽视频| 亚洲一区日韩精品颜射| 国内一级黄色片免费观看|