天天看點

MySQL 備份系列(3)-- innobackupex備份mysql大資料(全量+增量)操作記錄

在日常的linux運維工作中,大資料量備份與還原,始終是個難點。關于mysql的備份和恢複,比較傳統的是用mysqldump工具,今天這裡推薦另一個備份工具innobackupex。innobackupex和mysqldump都可以對mysql進行熱備份的,mysqldump對mysql的innodb的備份可以使用single-transaction參數來開啟一個事務,利用innodb的mvcc來不進行鎖表進行熱備份,mysqldump備份是邏輯備份,備份出來的檔案是sql語句,是以備份和恢複的時候很慢,但是備份和恢複時候很清楚。當MYSQL資料超過10G時,用mysqldump來導出備份就比較慢了,此種情況下用innobackupex這個工具就比mysqldump要快很多。利用它對mysql做全量和增量備份,僅僅依據本人實戰操作做一記錄,如有誤述,敬請指出~

一、innobackupex的介紹

Xtrabackup是由percona開發的一個開源軟體,是使用perl語言完成的腳本工具,能夠非常快速地備份與恢複mysql資料庫,且支援線上熱備份(備份時不影響資料讀寫),此工具調用xtrabackup和tar4ibd工具,實作很多對性能要求并不高的任務和備份邏輯,可以說它是innodb熱備工具ibbackup的一個開源替代品。

Xtrabackup中包含兩個工具:

1)xtrabackup :隻能用于熱備份innodb,xtradb兩種資料引擎表的工具,不能備份其他表。

2)innobackupex:是一個對xtrabackup封裝的perl腳本,提供了用于myisam(會鎖表)和innodb引擎,及混合使用引擎備份的能力。主要是為了友善同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。并且加入了一些使用的選項。如slave-info可以記錄備份恢 複後,作為slave需要的一些資訊,根據這些資訊,可以很友善的利用備份來重做slave。

innobackupex比xtarbackup有更強的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量備份/恢複,還可以基于時間的增量備份與恢複。innobackupex同時支援innodb,myisam。

Xtrabackup可以做什麼

1)線上(熱)備份整個庫的InnoDB, XtraDB表

2)在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)

3)以流的形式産生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)

MySQL資料庫本身提供的工具并不支援真正的增量備份,二進制日志恢複是point-in-time(時間點)的恢複而不是增量備份。Xtrabackup工具支援對InnoDB存儲引擎的增量備份,工作原理如下:

1)首先完成一個完全備份,并記錄下此時檢查點的LSN(Log Sequence Number)。

2)在程序增量備份時,比較表空間中每個頁的LSN是否大于上次備份時的LSN,如果是,則備份該頁,同時記錄目前檢查點的LSN。首先,在logfile中找到并記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接着,開始拷貝全部的資料檔案.ibd;在拷貝全部資料檔案結束之後,才停止拷貝logfile。因為logfile裡面記錄全部的資料修改情況,是以,即時在備份過程中資料檔案被修改過了,恢複時仍然能夠通過解析xtrabackup_logfile保持資料的一緻。

innobackupex備份mysql資料的流程

innobackupex首先調用xtrabackup來備份innodb資料檔案,當xtrabackup完成後,innobackupex就檢視檔案xtrabackup_suspended ;然後執行“FLUSH TABLES WITH READ LOCK”來備份其他的檔案。

innobackupex恢複mysql資料的流程

innobackupex首先讀取my.cnf,檢視變量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)對應的目錄是存在,确定相關目錄存在後,然後先copy myisam表和索引,然後在copy innodb的表、索引和日志。

------------------------------------------------------------------------------------------------------------------------------------------

下面詳細說下innobackupex備份和恢複的工作原理:

(1)備份的工作原理

       如果在程式啟動階段未指定模式,innobackupex将會預設以備份模式啟動。

       預設情況下,此腳本以--suspend-at-end選項啟動xtrabackup,然後xtrabackup程式開始拷貝InnoDB資料檔案。當xtrabackup程式執行結束,innobackupex将會發現xtrabackup建立了xtrabackup_suspended_2檔案,然後執行FLUSH TABLES WITH READ LOCK,此語句對所有的資料庫表加讀鎖。然後開始拷貝其他類型的檔案。

       如果--ibbackup未指定,innobackupex将會自行嘗試确定使用的xtrabackup的binary。其确定binary的邏輯如下:首先判斷備份目錄中xtrabackup_binary檔案是否存在,如果存在,此腳本将會依據此檔案确定使用的xtrabackup binary。否則,腳本将會嘗試連接配接database server,通過server版本确定binary。如果連接配接無法建立,xtrabackup将會失敗,需要自行指定binary檔案。

       在binary被确定後,将會檢查到資料庫server的連接配接是否可以建立。其執行邏輯是:建立連接配接、執行query、關閉連接配接。若一切正常,xtrabackup将以子程序的方式啟動。

       FLUSH TABLES WITH READ LOCK是為了備份MyISAM和其他非InnoDB類型的表,此語句在xtrabackup已經備份InnoDB資料和日志檔案後執行。在這之後,将會備份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 類型的檔案。

       當所有上述檔案備份完成後,innobackupex腳本将會恢複xtrabackup的執行,等待其備份上述邏輯執行過程中生成的事務日志檔案。接下來,表被解鎖,slave被啟動,到server的連接配接被關閉。接下來,腳本會删掉xtrabackup_suspended_2檔案,允許xtrabackup程序退出。

(2)恢複的工作原理

       為了恢複一個備份,innobackupex需要以--copy-back選項啟動。

       innobackupex将會首先通過my.cnf檔案讀取如下變量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,并确定這些目錄存在。

       接下來,此腳本将會首先拷貝MyISAM表、索引檔案、其他類型的檔案(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下來拷貝InnoDB表資料檔案,最後拷貝日志檔案。拷貝執行時将會保留檔案屬性,在使用備份檔案啟動MySQL前,可能需要更改檔案的owener(如從拷貝檔案的user更改到mysql使用者)。

---------------------------------------------------------------------------------------------------------------------------------------------

二、innobackupex針對mysql資料庫的備份環境部署

1)源碼安裝Xtrabackup,将源碼包下載下傳到/usr/local/src下

源碼包下載下傳

[root@test-huanqiu ~]# cd /usr/local/src

先安裝依賴包

[root@test-huanqiu src]# yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool  zlib-devel libgcrypt-devel  libcurl-devel  crypt*  libgcrypt* python-sphinx openssl   imake libxml2-devel expat-devel   ncurses5-devel ncurses-devle   vim-common  libgpg-error-devel   libidn-devel perl-DBI  perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL 

[root@test-huanqiu src]# wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/source/percona-xtrabackup-2.1.9.tar.gz

[root@test-huanqiu src]# tar -zvxf percona-xtrabackup-2.1.9.tar.gz

[root@test-huanqiu src]# cd percona-xtrabackup-2.1.9

[root@test-huanqiu percona-xtrabackup-2.1.9]# ./utils/build.sh                     //執行該安裝腳本,會出現下面資訊

Build an xtrabackup binary against the specified InnoDB flavor.

Usage: build.sh CODEBASE

where CODEBASE can be one of the following values or aliases:

innodb51 | plugin build against InnoDB plugin in MySQL 5.1

innodb55 | 5.5 build against InnoDB in MySQL 5.5

innodb56 | 5.6,xtradb56, build against InnoDB in MySQL 5.6

| mariadb100,galera56

xtradb51 | xtradb,mariadb51 build against Percona Server with XtraDB 5.1

| mariadb52,mariadb53

xtradb55 | galera55,mariadb55 build against Percona Server with XtraDB 5.5

根據上面提示和你使用的存儲引擎及版本,選擇相應的參數即可。因為我用的是MySQL 5.6版本,是以執行如下語句安裝:

[root@test-huanqiu percona-xtrabackup-2.1.9]# ./utils/build.sh innodb56

以上語句執行成功後,表示安裝完成。

最後,把生成的二進制檔案拷貝到一個自定義目錄下(本例中為/home/mysql/admin/bin/percona-xtrabackup-2.1.9),并把該目錄放到環境變量PATH中。

[root@test-huanqiu  percona-xtrabackup-2.1.9]# mkdir -p /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[root@test-huanqiu  percona-xtrabackup-2.1.9]# cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[root@test-huanqiu  percona-xtrabackup-2.1.9]# cp ./src/xtrabackup_56 ./src/xbstream  /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[root@test-huanqiu  percona-xtrabackup-2.1.9]# vim /etc/profile

.......

export PATH=$PATH:/home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[root@test-huanqiu  percona-xtrabackup-2.1.9]# source /etc/profile

測試下innobackupex是否正常使用

[root@test-huanqiu percona-xtrabackup-2.1.9]# innobackupex --help

--------------------------------------------------------------------------------------------------------------------------------------------

可能報錯1

Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.

BEGIN failed--compilation aborted at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.

解決方案:

.pm實際上是Perl的包,隻需安裝perl-Time-HiRes即可:

[root@test-huanqiu percona-xtrabackup-2.1.9]# yum install -y perl-Time-HiRes

可能報錯2

Can't locate DBI.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.

BEGIN failed--compilation aborted at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.

報錯原因:系統沒有按安裝DBI元件。

DBI(Database Interface)是perl連接配接資料庫的接口。其是perl連接配接資料庫的最優秀方法,他支援包括Orcal,Sybase,mysql,db2等絕大多數的資料庫。

解決辦法:

安裝DBI元件(Can't locate DBI.pm in @INC-mysql接口)

或者單獨裝DBI、Data-ShowTable、DBD-mysql 三個元件

[root@test-huanqiu percona-xtrabackup-2.1.9]# yum -y install perl-DBD-MySQL

接着使用innobackupex指令測試是否正常

[root@test-huanqiu percona-xtrabackup-2.1.9]# innobackupex --help

Options:

--apply-log

Prepare a backup in BACKUP-DIR by applying the transaction log file

named "xtrabackup_logfile" located in the same directory. Also,

create new transaction logs. The InnoDB configuration is read from

the file "backup-my.cnf".

--compact

Create a compact backup with all secondary index pages omitted. This

option is passed directly to xtrabackup. See xtrabackup

documentation for details.

--compress

This option instructs xtrabackup to compress backup copies of InnoDB

data files. It is passed directly to the xtrabackup child process.

Try 'xtrabackup --help' for more details.

............

-------------------------------------------------------------------------------------------------------------------------------------------------------------

2)全量備份和恢複

---------------->全量備份操作<----------------

執行下面語句進行全備:

mysql的安裝目錄是/usr/local/mysql

mysql的配置檔案路徑/usr/local/mysql/my.cnf

mysql的密碼是123456

全量備份後的資料存放目錄是/backup/mysql/data

[root@test-huanqiu ~]# mkdir -p /backup/mysql/data

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 /backup/mysql/data

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved.

...................

161201 00:07:15 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup' as 'root' (using password: YES).

161201 00:07:15 innobackupex: Connected to MySQL server

161201 00:07:15 innobackupex: Executing a version check against the server...

161201 00:07:15 innobackupex: Done.

..................

161201 00:07:19 innobackupex: Connection to database server closed

161201 00:07:19 innobackupex: completed OK!

出現上面的資訊,表示備份已經ok。

上面執行的備份語句會将mysql資料檔案(即由my.cnf裡的變量datadir指定)拷貝至備份目錄下(/backup/mysql/data)

注意:如果不指定--defaults-file,預設值為/etc/my.cnf。

備份成功後,将在備份目錄下建立一個時間戳目錄(本例建立的目錄為/backup/mysql/data/2016-12-01_00-07-15),在該目錄下存放備份檔案。

檢視備份資料:

[root@test-huanqiu ~]# ll /backup/mysql/data

total 4

drwxr-xr-x. 6 root root 4096 Dec 1 00:07 2016-12-01_00-07-15

[root@test-huanqiu ~]# ll /backup/mysql/data/2016-12-01_00-07-15/

total 12324

-rw-r--r--. 1 root root 357 Dec 1 00:07 backup-my.cnf

drwx------. 2 root root 4096 Dec 1 00:07 huanqiu

-rw-r-----. 1 root root 12582912 Dec 1 00:07 ibdata1

drwx------. 2 root root 4096 Dec 1 00:07 mysql

drwxr-xr-x. 2 root root 4096 Dec 1 00:07 performance_schema

drwxr-xr-x. 2 root root 4096 Dec 1 00:07 test

-rw-r--r--. 1 root root 13 Dec 1 00:07 xtrabackup_binary

-rw-r--r--. 1 root root 24 Dec 1 00:07 xtrabackup_binlog_info

-rw-r-----. 1 root root 89 Dec 1 00:07 xtrabackup_checkpoints

-rw-r-----. 1 root root 2560 Dec 1 00:07 xtrabackup_logfile

----------------------------------------------------------------------------------------------------------------------------------

可能報錯1:

161130 05:56:48 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup' as 'root' (using password: YES).

innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 2956.

[root@test-huanqiu ~]# yum -y install perl-DBD-MySQL.x86_64

......

Package perl-DBD-MySQL-4.013-3.el6.x86_64 already installed and latest version                //發現本機已經安裝了

[root@test-huanqiu ~]# rpm -qa|grep perl-DBD-MySQL

perl-DBD-MySQL-4.013-3.el6.x86_64

發現本機已經安裝了最新版的perl-DBD-MYSQL了,但是仍然報出上面的錯誤!!

莫慌~~繼續下面的操作進行問題的解決

檢視mysql.so依賴的lib庫

[root@test-huanqiu ~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so

linux-vdso.so.1 => (0x00007ffd291fc000)

libmysqlclient.so.16 => not found                                                   //這一項為通過檢查,缺失libmysqlclient.so.16庫導緻

libz.so.1 => /lib64/libz.so.1 (0x00007f78ff9de000)

libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f78ff7a7000)

libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f78ff58e000)

libm.so.6 => /lib64/libm.so.6 (0x00007f78ff309000)

libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f78ff09d000)

libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f78fecb9000)

libc.so.6 => /lib64/libc.so.6 (0x00007f78fe924000)

libfreebl3.so => /lib64/libfreebl3.so (0x00007f78fe721000)

libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f78fe4dd000)

libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f78fe1f5000)

libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f78fdff1000)

libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f78fddc5000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007f78fdbc0000)

/lib64/ld-linux-x86-64.so.2 (0x00007f78ffe1d000)

libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f78fd9b5000)

libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f78fd7b2000)

libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f78fd597000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f78fd37a000)

libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f78fd15a000)

以上結果說明缺少libmysqlclient.so.16這個二進制包,找個官方原版的mysql的libmysqlclient.so.16替換了即可!

[root@test-huanqiu~]# find / -name libmysqlclient.so.16                                   //檢視本機并沒有libmysqlclient.so.16庫檔案

檢視mysql/lib下的libmysqlclinet.so庫檔案

[root@test-huanqiu~]# ll /usr/local/mysql/lib/

total 234596

-rw-r--r--. 1 mysql mysql 19520800 Nov 29 12:27 libmysqlclient.a

lrwxrwxrwx. 1 mysql mysql 16 Nov 29 12:34 libmysqlclient_r.a -> libmysqlclient.a

lrwxrwxrwx. 1 mysql mysql 17 Nov 29 12:34 libmysqlclient_r.so -> libmysqlclient.so

lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient_r.so.18 -> libmysqlclient.so.18

lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0

lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient.so -> libmysqlclient.so.18

lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0

-rwxr-xr-x. 1 mysql mysql 8858235 Nov 29 12:27 libmysqlclient.so.18.1.0

-rw-r--r--. 1 mysql mysql 211822074 Nov 29 12:34 libmysqld.a

-rw-r--r--. 1 mysql mysql 14270 Nov 29 12:27 libmysqlservices.a

drwxr-xr-x. 3 mysql mysql 4096 Nov 29 12:34 plugin

将mysql/lib/libmysqlclient.so.18.1.0庫檔案拷貝到/lib64下,拷貝後命名為libmysqlclient.so.16

[root@test-huanqiu~]# cp /usr/local/mysql/lib/libmysqlclient.so.18.1.0 /lib64/libmysqlclient.so.16

[root@test-huanqiu~]# cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

/usr/local/mysql/lib/

/lib64/

[root@test-huanqiu~]# ldconfig

最後解除安裝perl-DBD-MySQL,并重新安裝perl-DBD-MySQL

[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL

[root@test-huanqiu~]# rpm -e --nodeps perl-DBD-MySQL

[root@test-huanqiu~]# yum -y install perl-DBD-MySQL

待重新安裝後,再次重新檢查mysql.so依賴的lib庫,發現已經都通過了

[root@test-huanqiu~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so

linux-vdso.so.1 => (0x00007ffe3669b000)

libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007f4af5c25000)

libz.so.1 => /lib64/libz.so.1 (0x00007f4af5a0f000)

libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f4af57d7000)

libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f4af55be000)

libm.so.6 => /lib64/libm.so.6 (0x00007f4af533a000)

libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4af50cd000)

libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4af4ce9000)

libc.so.6 => /lib64/libc.so.6 (0x00007f4af4955000)

libfreebl3.so => /lib64/libfreebl3.so (0x00007f4af4751000)

libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f4af450d000)

libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f4af4226000)

libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f4af4021000)

libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f4af3df5000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007f4af3bf1000)

/lib64/ld-linux-x86-64.so.2 (0x00007f4af61d1000)

libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f4af39e5000)

libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f4af37e2000)

libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f4af35c8000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4af33aa000)

libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4af318b000)

sh: xtrabackup_56: command not found

innobackupex: Error: no 'mysqld' group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.

有可能是percona-xtrabackup編譯安裝後,在編譯目錄的src下存在xtrabackup_innodb56,隻需要其更名為xtrabackup_56,然後拷貝到上面的/home/mysql/admin/bin/percona-xtrabackup-2.1.9/下即可!

還可以在遠端進行全量備份,指令如下:

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --host=127.0.0.1 --parallel=2 --throttle=200 /backup/mysql/data 2>/backup/mysql/data/bak.log 1>/backup/mysql/data/`data +%Y-%m-%d_%H-%M%S`

參數解釋:

--user=root             備份操作使用者名,一般都是root使用者

--password=root123          資料庫密碼

--host=127.0.0.1            主機ip,本地可以不加(适用于遠端備份)。注意要提前在mysql中授予連接配接的權限,最好備份前先測試用指令中的使用者名、密碼和host能否正常連接配接mysql。

--parallel=2 --throttle=200      并行個數,根據主機配置選擇合适的,預設是1個,多個可以加快備份速度。

/backup/mysql/data            備份存放的目錄

2>/backup/mysql/data/bak.log       備份日志,将備份過程中的輸出資訊重定向到bak.log

這種備份跟上面相比,備份成功後,不會自動在備份目錄下建立一個時間戳目錄,需要如上指令中自己定義。

[root@test-huanqiu ~]# cd /backup/mysql/data/

[root@test-huanqiu data]# ll

drwxr-xr-x. 6 root root 4096 Dec 1 03:18 2016-12-01_03-18-37

-rw-r--r--. 1 root root 5148 Dec 1 03:18 bak.log

[root@test-huanqiu data]# cat bak.log         //備份資訊都記錄在這個日志裡,如果備份失敗,可以到這裡日志裡查詢

----------------------------------------------------------------------------------------------------------------------------

---------------->全量備份後的恢複操作<----------------

比如在上面進行全量備份後,由于誤操作将資料庫中的huanqiu庫删除了。

[root@test-huanqiu ~]# mysql -p123456

mysql> show databases;

+--------------------+

| Database |

| information_schema |

| huanqiu |

| mysql |

| performance_schema |

| test |

5 rows in set (0.00 sec)

mysql> use huanqiu;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+-------------------------+

| Tables_in_huanqiu |

| card_agent_file |

| product_sale_management |

2 rows in set (0.00 sec)

mysql> drop database huanqiu;

Query OK, 2 rows affected (0.12 sec)

4 rows in set (0.00 sec)

現在進行恢複資料操作

注意:恢複之前

1)要先關閉資料庫

2)要删除資料檔案和日志檔案(也可以mv移到别的地方,隻要確定清空mysql資料存放目錄就行)

[root@test-huanqiu ~]# ps -ef|grep mysql

root 2442 21929 0 00:25 pts/2 00:00:00 grep mysql

root 28279 1 0 Nov29 ? 00:00:00 /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid

mysql 29059 28279 0 Nov29 ? 00:09:07 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql/ --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql//lib/plugin --user=mysql --log-error=/data/mysql/data/mysql-error.log --pid-file=/data/mysql/data/mysql.pid --socket=/usr/local/mysql/var/mysql.sock --port=3306

由上面可查出mysql的資料和日志存放目錄是/data/mysql/data

[root@test-huanqiu ~]# /etc/init.d/mysql stop

Shutting down MySQL.. SUCCESS!

[root@test-huanqiu ~]# rm -rf /data/mysql/data/*

[root@test-huanqiu ~]# ls /data/mysql/data

[root@test-huanqiu ~]#

檢視備份資料

[root@[root@test-huanqiu ~]# ls /backup/mysql/data/

2016-12-01_00-07-15

恢複資料

[root@[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --use-memory=4G --apply-log /backup/mysql/data/2016-12-01_00-07-15

[root@[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --copy-back /backup/mysql/data/2016-12-01_00-07-15

........

innobackupex: Copying '/backup/mysql/data/2016-12-01_00-07-15/ib_logfile2' to '/data/mysql/data/ib_logfile2'

innobackupex: Copying '/backup/mysql/data/2016-12-01_00-07-15/ib_logfile0' to '/data/mysql/data/ib_logfile0'

innobackupex: Finished copying back files.

161201 00:31:33 innobackupex: completed OK!

出現上面的資訊,說明資料恢複成功了!!

從上面的恢複操作可以看出,執行恢複分為兩個步驟:

1)第一步恢複步驟是應用日志(apply-log),為了加快速度,一般建議設定--use-memory(如果系統記憶體充足,可以使用加大記憶體進行備份 ),這個步驟完成之後,目錄/backup/mysql/data/2016-12-01_00-07-15下的備份檔案已經準備就緒。

2)第二步恢複步驟是拷貝檔案(copy-back),即把備份檔案拷貝至原資料目錄下。

恢複完成之後,一定要記得檢查資料目錄的所有者和權限是否正确。

[root@test-huanqiu ~]# ll /data/mysql/data/

total 110608

drwxr-xr-x. 2 root root 4096 Dec 1 00:31 huanqiu

-rw-r--r--. 1 root root 12582912 Dec 1 00:31 ibdata1

-rw-r--r--. 1 root root 33554432 Dec 1 00:31 ib_logfile0

-rw-r--r--. 1 root root 33554432 Dec 1 00:31 ib_logfile1

-rw-r--r--. 1 root root 33554432 Dec 1 00:31 ib_logfile2

drwxr-xr-x. 2 root root 4096 Dec 1 00:31 mysql

drwxr-xr-x. 2 root root 4096 Dec 1 00:31 performance_schema

drwxr-xr-x. 2 root root 4096 Dec 1 00:31 test

[root@test-huanqiu ~]# chown -R mysql.mysql /data/mysql/data/                                   //将資料目錄的權限修改為mysql:mysql

drwxr-xr-x. 2 mysql mysql 4096 Dec 1 00:31 huanqiu

-rw-r--r--. 1 mysql mysql 12582912 Dec 1 00:31 ibdata1

-rw-r--r--. 1 mysql mysql 33554432 Dec 1 00:31 ib_logfile0

-rw-r--r--. 1 mysql mysql 33554432 Dec 1 00:31 ib_logfile1

-rw-r--r--. 1 mysql mysql 33554432 Dec 1 00:31 ib_logfile2

drwxr-xr-x. 2 mysql mysql 4096 Dec 1 00:31 mysql

drwxr-xr-x. 2 mysql mysql 4096 Dec 1 00:31 performance_schema

drwxr-xr-x. 2 mysql mysql 4096 Dec 1 00:31 test

-------------------------------------------------------------------------------------------------------------------------------------------

可能報錯:

sh: xtrabackup: command not found

解決:将xtrabackup_56複制成xtrabackup即可

[root@test-huanqiu percona-xtrabackup-2.1.9]# ls

innobackupex xbstream xtrabackup_56

[root@test-huanqiu percona-xtrabackup-2.1.9]# cp xtrabackup_56 xtrabackup

innobackupex xbstream xtrabackup xtrabackup_56

最後,啟動mysql,檢視資料是否恢複回來了

[root@test-huanqiu ~]# /etc/init.d/mysql start

Starting MySQL.. SUCCESS!

mysql>

3)增量備份和恢複

---------------->增量備份操作<----------------

特别注意:

innobackupex 增量備份僅針對InnoDB這類支援事務的引擎,對于MyISAM等引擎,則仍然是全備。

增量備份需要基于全量備份

先假設我們已經有了一個全量備份(如上面的/backup/mysql/data/2016-12-01_00-07-15),我們需要在該全量備份的基礎上做第一次增量備份。

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --incremental-basedir=/backup/mysql/data/2016-12-01_00-07-15 --incremental /backup/mysql/data

其中:

--incremental-basedir     指向全量備份目錄

--incremental       指向增量備份的目錄

上面語句執行成功之後,會在--incremental執行的目錄下建立一個時間戳子目錄(本例中為:/backup/mysql/data/2016-12-01_01-12-22),在該目錄下存放着增量備份的所有檔案。

[root@test-huanqiu ~]# ll /backup/mysql/data/

total 8

drwxr-xr-x. 6 root root 4096 Dec 1 00:27 2016-12-01_00-07-15                //全量備份目錄

drwxr-xr-x. 6 root root 4096 Dec 1 01:12 2016-12-01_01-12-22                //增量備份目錄

在備份目錄下,有一個檔案xtrabackup_checkpoints記錄着備份資訊,其中可以查出

1)全量備份的資訊如下:

[root@test-huanqiu 2016-12-01_00-07-15]# pwd

/backup/mysql/data/2016-12-01_00-07-15

[root@test-huanqiu 2016-12-01_00-07-15]# cat xtrabackup_checkpoints

backup_type = full-prepared

from_lsn = 0

to_lsn = 1631561

last_lsn = 1631561

compact = 0

2)基于以上全量備份的增量備份的資訊如下:

[root@test-huanqiu 2016-12-01_01-12-22]# pwd

/backup/mysql/data/2016-12-01_01-12-22

[root@test-huanqiu 2016-12-01_01-12-22]# cat xtrabackup_checkpoints

backup_type = incremental

from_lsn = 1631561

to_lsn = 1631776

last_lsn = 1631776

從上面可以看出,增量備份的from_lsn正好等于全備的to_lsn。

那麼,我們是否可以在增量備份的基礎上再做增量備份呢?

答案是肯定的,隻要把--incremental-basedir執行上一次增量備份的目錄即可,如下所示:

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --incremental-basedir=/backup/mysql/data/2016-12-01_01-12-22 --incremental /backup/mysql/data

total 12

drwxr-xr-x. 6 root root 4096 Dec 1 00:27 2016-12-01_00-07-15            //全量備份目錄

drwxr-xr-x. 6 root root 4096 Dec 1 01:12 2016-12-01_01-12-22            //增量備份目錄1

drwxr-xr-x. 6 root root 4096 Dec 1 01:23 2016-12-01_01-23-23           //增量備份目錄2

它的xtrabackup_checkpoints記錄着備份資訊如下:

[root@test-huanqiu 2016-12-01_01-23-23]# pwd

/backup/mysql/data/2016-12-01_01-23-23

[root@test-huanqiu 2016-12-01_01-23-23]# cat xtrabackup_checkpoints

from_lsn = 1631776

to_lsn = 1638220

last_lsn = 1638220

可以看到,第二次增量備份的from_lsn是從上一次增量備份的to_lsn開始的。

---------------->增量備份後的恢複操作<----------------

增量備份的恢複要比全量備份複雜很多,增量備份與全量備份有着一些不同,尤其要注意的是:

1)需要在每個備份(包括完全和各個增量備份)上,将已經送出的事務進行“重放”。“重放”之後,所有的備份資料将合并到完全備份上。

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

第一步是在所有備份目錄下重做已送出的日志(注意備份目錄路徑要跟全路徑)

1)innobackupex --apply-log --redo-only BASE-DIR

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

3)innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

BASE-DIR 是指全量備份的目錄

INCREMENTAL-DIR-1 是指第一次增量備份的目錄

INCREMENTAL-DIR-2 是指第二次增量備份的目錄,以此類推。

這裡要注意的是:

1)最後一步的增量備份并沒有--redo-only選項!復原進行崩潰恢複過程

2)可以使用--use_memory提高性能。

以上語句執行成功之後,最終資料在BASE-DIR(即全量目錄)下,其實增量備份就是把增量目錄下的資料,整合到全變量目錄下,然後在進行,全資料量的還原。

第一步完成之後,我們開始下面關鍵的第二步,即拷貝檔案,進行全部還原!注意:必須先停止mysql資料庫,然後清空資料庫目錄(這裡是指/data/mysql/data)下的檔案。

4)innobackupex --copy-back BASE-DIR

同樣地,拷貝結束之後,記得檢查下資料目錄(這裡指/data/mysql/data)的權限是否正确(修改成mysql:mysql),然後再重新開機mysql。

接下來進行案例說明:

假設我們已經有了一個全量備份2016-12-01_00-07-15

删除在上面測試建立的兩個增量備份

drwxr-xr-x. 6 root root 4096 Dec 1 00:27 2016-12-01_00-07-15

drwxr-xr-x. 6 root root 4096 Dec 1 01:12 2016-12-01_01-12-22

drwxr-xr-x. 6 root root 4096 Dec 1 01:23 2016-12-01_01-23-23

[root@test-huanqiu data]# rm -rf 2016-12-01_01-12-22/

[root@test-huanqiu data]# rm -rf 2016-12-01_01-23-23/

假設在全量備份後,mysql資料庫中又有新資料寫入

.........

mysql> create database ceshi;

Query OK, 1 row affected (0.00 sec)

mysql> use ceshi;

mysql> create table test1(

-> id int3,

-> name varchar(20)

-> );

Query OK, 0 rows affected (0.07 sec)

mysql> insert into test1 values(1,"wangshibo");

Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> select * from test1;

+------+-----------+

| id | name |

| 1 | wangshibo |

1 row in set (0.00 sec)

| ceshi |

6 rows in set (0.00 sec)

mysql>

然後進行一次增量備份:

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --incremental-basedir=/backup/mysql/data/2016-12-01_00-07-15 --incremental /backup/mysql/data

drwxr-xr-x. 6 root root 4096 Dec 1 00:27 2016-12-01_00-07-15        //全量備份目錄

drwxr-xr-x. 7 root root 4096 Dec 1 03:41 2016-12-01_03-41-41        //增量備份目錄

接着再在mysql資料庫中寫入新資料

mysql> insert into test1 values(2,"guohuihui");

Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into test1 values(3,"wuxiang");

mysql> insert into test1 values(4,"liumengnan");

Query OK, 1 row affected, 1 warning (0.01 sec)

+------+------------+

| id | name |

| 1 | wangshibo |

| 2 | guohuihui |

| 3 | wuxiang |

| 4 | liumengnan |

接着在增量的基礎上再進行一次增量備份

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --incremental-basedir=/backup/mysql/data/2016-12-01_03-41-41 --incremental /backup/mysql/data

drwxr-xr-x. 6 root root 4096 Dec 1 00:27 2016-12-01_00-07-15       //全量備份目錄

drwxr-xr-x. 7 root root 4096 Dec 1 02:24 2016-12-01_02-24-11       //增量備份目錄1

drwxr-xr-x. 7 root root 4096 Dec 1 03:42 2016-12-01_03-42-43       //增量備份目錄2

現在删除資料庫huanqiu、ceshi

Query OK, 2 rows affected (0.02 sec)

mysql> drop database ceshi;

Query OK, 1 row affected (0.01 sec)

接下來就開始進行資料恢複操作:

先恢複應用日志(注意最後一個不需要加--redo-only參數)

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456  --apply-log --redo-only /backup/mysql/data/2016-12-01_00-07-15

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456  --apply-log --redo-only /backup/mysql/data/2016-12-01_00-07-15 --incremental-dir=/backup/mysql/data/2016-12-01_02-24-11

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456  --apply-log  /backup/mysql/data/2016-12-01_00-07-15 --incremental-dir=/backup/mysql/data/2016-12-01_03-42-43

到此,恢複資料工作還沒有結束!還有最重要的一個環節,就是把增量目錄下的資料整合到全量備份目錄下,然後再進行一次全量還原。

停止mysql資料庫,并清空資料目錄

最後拷貝檔案,并驗證資料目錄的權限

[root@test-huanqiu ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --copy-back /backup/mysql/data/2016-12-01_00-07-15

[root@test-huanqiu ~]# chown -R mysql.mysql /data/mysql/data/*

最後,檢查下資料是否恢複

| Database |

| ceshi |

| huanqiu |

| mysql |

| test |

mysql> select * from ceshi.test1;

| id | name |

| 1 | wangshibo |

| 2 | guohuihui |

| 3 | wuxiang |

| 4 | liumengnan |

另外注意:

上面在做備份的時候,将備份目錄和增量目錄都放在了同一個目錄路徑下,其實推薦放在不同的路徑下,友善管理!比如:

/backup/mysql/data/full 存放全量備份目錄

/backup/mysql/data/daily1 存放第一次增量備份目錄

/backup/mysql/data/daily2 存放第二次增量目錄

以此類推

在恢複的時候,注意指令中的路徑要跟對!

-----------------------------------------------------------------------------------------------------

innobackupex 常用參數說明

--defaults-file

同xtrabackup的--defaults-file參數

--apply-log

對xtrabackup的--prepare參數的封裝

--copy-back

做資料恢複時将備份資料檔案拷貝到MySQL伺服器的datadir ;

--remote-host=HOSTNAME

通過ssh将備份資料存儲到程序伺服器上;

--stream=[tar]

備 份檔案輸出格式, tar時使用tar4ibd , 該檔案可在XtarBackup binary檔案中獲得.如果備份時有指定--stream=tar, 則tar4ibd檔案所處目錄一定要在$PATH中(因為使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可獲得該檔案)。

在 使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候并發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題。

--tmpdir=DIRECTORY

當有指定--remote-host or --stream時, 事務日志臨時存儲的目錄, 預設采用MySQL配置檔案中所指定的臨時目錄tmpdir

--redo-only --apply-log組,

強制備份日志時隻redo ,跳過rollback。這在做增量備份時非常必要。

--use-memory=#

該參數在prepare的時候使用,控制prepare時innodb執行個體使用的記憶體量

--throttle=IOS

同xtrabackup的--throttle參數

--sleep=是給ibbackup使用的,指定每備份1M資料,過程停止拷貝多少毫秒,也是為了在備份時盡量減小對正常業務的影響,具體可以檢視ibbackup的手冊 ;

--compress[=LEVEL]

對備份資料迚行壓縮,僅支援ibbackup,xtrabackup還沒有實作;

--include=REGEXP

對 xtrabackup參數--tables的封裝,也支援ibbackup。備份包含的庫表,例如:--include="test.*",意思是要備份 test庫中所有的表。如果需要全備份,則省略這個參數;如果需要備份test庫下的2個表:test1和test2,則寫 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。

--databases=LIST

列出需要備份的databases,如果沒有指定該參數,所有包含MyISAM和InnoDB表的database都會被備份;

--uncompress

解壓備份的資料檔案,支援ibbackup,xtrabackup還沒有實作該功能;

--slave-info,

備 份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 檔案, 這裡會儲存主日志檔案以及偏移, 檔案内容類似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET

指定mysql.sock所在位置,以便備份程序登入mysql.

三、innobackupex全量、增量備份腳本

可以根據自己線上資料庫情況,編寫全量和增量備份腳本,然後結合crontab設定計劃執行。

比如:每周日的1:00進行全量備份,每周1-6的1:00進行增量備份。

還可以在腳本裡編寫郵件通知資訊(可以用mail或sendemail)

==================================================================

在使用xtrabackup對mysql執行備份操作的時候,出現下面的報錯:
.....................
xtrabackup: innodb_log_file_size = 50331648
InnoDB: Error: log file ./ib_logfile0 is of different size 33554432 bytes
InnoDB: than specified in the .cnf file 50331648 bytes!


解決辦法:
可以計算一下33554432的大小,33554432/1024/1024=32
檢視my.cnf配置檔案的innodb_log_file_size參數配置:
innodb_log_file_size = 32M

需要調整這個檔案的大小
再計算一下50331648的大小,50331648/1024/1024=48

修改my.cnf配置檔案的下面一行參數值:
innodb_log_file_size = 48M

然後重新開機mysql      

============下面是曾經使用過的一個mysql通過innobackupex進行增量備份腳本===========

[root@mysql-node ~]# cat /data/backup/script/incremental-backup-mysql.sh
#!/bin/sh
#########################################################################
## Description: Mysql增量備份腳本
## File Name: incremental-backup-mysql.sh
## Author: wangshibo
## mail: [email protected]
## Created Time: 2018年1月11日 14:17:09
##########################################################################
today=`date +%Y%m%d`
datetime=`date +%Y%m%d-%H-%M-%S`
config=/etc/my.cnf
basePath=/data/backup
logfilePath=$basePath/logs
logfile=$logfilePath/incr_$datetime.log
USER=mybak
PASSWD=Mysql@!@#1988check
dataBases="activiti batchdb core scf_v2 midfax asset bc_asset"

pid=`ps -ef | grep -v "grep" |grep -i innobackupex|awk '{print $2}'|head -n 1`
if [ -z $pid ]
then
  echo " start incremental backup database " >> $logfile 
  OneMonthAgo=`date -d "1 month ago"  +%Y%m%d`
  path=$basePath/incr_$datetime
  mkdir -p $path
  last_backup=`cat $logfilePath/last_backup_sucess.log| head -1`
  echo " last backup is ===> " $last_backup >> $logfile 
sudo /data/backup/script/percona-xtrabackup-2.4.2-Linux-x86_64/bin/innobackupex  --defaults-file=$config  --user=$USER --password=$PASSWD --compress --compress-threads=2 --compress-chunk-size=64K --slave-info --safe-slave-backup  --host=localhost --incremental $path --incremental-basedir=$last_backup --databases="${dataBases}" --no-timestamp >> $logfile 2>&1 
sudo chown app.app $path -R
  ret=`tail -n 2 $logfile |grep "completed OK"|wc -l`
  if [ "$ret" =  1 ] ; then 
    echo 'delete expired backup ' $basePath/incr_$OneMonthAgo*  >> $logfile
    rm -rf $basePath/incr_$OneMonthAgo*
    rm -f $logfilePath/incr_$OneMonthAgo*.log
    echo $path > $logfilePath/last_backup_sucess.log
  else
    echo 'backup failure ,no delete expired backup'  >> $logfile
  fi
else
   echo "****** innobackupex in backup database  ****** "  >> $logfile
fi


增量備份檔案放在了本機的/data/backup目錄下,再編寫一個rsync腳本同步到遠端備份機上(192.168.10.130):
[root@mysql-node ~]# cat /data/rsync.sh 
#!/bin/bash
datetime=`date +%Y%m%d-%H-%M-%S`
logfile=/data/rsync.log
echo "$datetime Rsync backup mysql start "  >> $logfile
sudo rsync -e "ssh -p6666" -avpgolr /data/backup [email protected]:/data/backup_data/bigtree/DB_bak/10.0.40.52/ >> $logfile 2>&1

ret=`tail -n 1 $logfile |grep "total size"|wc -l`
if [ "$ret" =  1 ] ; then 
        echo "$datetime Rsync backup mysql finish " >> $logfile
else
        echo "$datetime Rsync backup failure ,pls sendmail"  >> $logfile
fi


結合crontab進行定時任務執行(每4個小時執行一次)
[root@mysql-node ~]# crontab -e
1 4,8,12,16,20,23 * * * /data/backup/script/incremental-backup-mysql.sh > /dev/null 2>&1
10 0,4,8,12,16,20,23 * * * /data/rsync.sh > /dev/null 2>&1


順便看一下本機/data/backup目錄下面的增量備份資料
[root@mysql-node ~]# ll /data/backup
總用量 786364
drwxr-xr-x  2 app app      4096 7月  31 01:01 2018-07-31
drwxr-xr-x  2 app app      4096 8月   1 01:01 2018-08-01
drwxr-xr-x 14 app app      4096 7月  31 00:01 full_20180731-00-01-01
drwxr-xr-x 14 app app      4096 8月   1 00:01 full_20180801-00-01-01
drwxr-xr-x  9 app app      4096 7月  31 04:01 incr_20180731-04-01-01
drwxr-xr-x  9 app app      4096 7月  31 08:01 incr_20180731-08-01-01
drwxr-xr-x  9 app app      4096 7月  31 12:01 incr_20180731-12-01-01
drwxr-xr-x  9 app app      4096 7月  31 16:01 incr_20180731-16-01-01
drwxr-xr-x  9 app app      4096 7月  31 20:01 incr_20180731-20-01-01
drwxr-xr-x  9 app app      4096 7月  31 23:01 incr_20180731-23-01-01
drwxr-xr-x  9 app app      4096 8月   1 04:01 incr_20180801-04-01-01
drwxr-xr-x  9 app app      4096 8月   1 08:01 incr_20180801-08-01-01
drwxr-xr-x  9 app app      4096 8月   1 12:01 incr_20180801-12-01-01
drwxr-xr-x  9 app app      4096 8月   1 16:01 incr_20180801-16-01-01
drwxr-xr-x  9 app app      4096 8月   1 20:01 incr_20180801-20-01-01
drwxr-xr-x  9 app app      4096 8月   1 23:01 incr_20180801-23-01-01
drwxrwxr-x  2 app app     20480 8月   9 08:01 logs
drwxrwxr-x  3 app app      4096 7月  12 17:43 script      

*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************