Xtrabackup使用指南 InnoDB數(shù)據(jù)備份工具
更新時(shí)間:2011年10月29日 02:24:34 作者:
Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品
一、Xtrabackup介紹
A、Xtrabackup是什么
Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品。
Xtrabackup有兩個(gè)主要的工具:xtrabackup、innobackupex
1、xtrabackup只能備份InnoDB和XtraDB兩種數(shù)據(jù)表,而不能備份MyISAM數(shù)據(jù)表
2、innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個(gè)perl腳本封裝,封裝了xtrabackup。主要是為了方便的 同時(shí)備份InnoDB和MyISAM引擎的表,但在處理myisam時(shí)需要加一個(gè)讀鎖。并且加入了一些使用的選項(xiàng)。如slave-info可以記錄備份恢 復(fù)后,作為slave需要的一些信息,根據(jù)這些信息,可以很方便的利用備份來重做slave。
3、官方文檔:http://www.percona.com/docs/wiki/percona-xtrabackup:start
B、Xtrabackup可以做什么
在線(熱)備份整個(gè)庫(kù)的InnoDB、 XtraDB表
在xtrabackup的上一次整庫(kù)備份基礎(chǔ)上做增量備份(innodb only)
以流的形式產(chǎn)生備份,可以直接保存到遠(yuǎn)程機(jī)器上(本機(jī)硬盤空間不足時(shí)很有用)
MySQL數(shù)據(jù)庫(kù)本身提供的工具并不支持真正的增量備份,二進(jìn)制日志恢復(fù)是point-in-time(時(shí)間點(diǎn))的恢復(fù)而不是增量備份。Xtrabackup工具支持對(duì)InnoDB存儲(chǔ)引擎的增量備份,工作原理如下:
(1)首先完成一個(gè)完全備份,并記錄下此時(shí)檢查點(diǎn)的LSN(Log Sequence Number)。
(2)在進(jìn)程增量備份時(shí),比較表空間中每個(gè)頁(yè)的LSN是否大于上次備份時(shí)的LSN,如果是,則備份該頁(yè),同時(shí)記錄當(dāng)前檢查點(diǎn)的LSN。
首先,在logfile中找到并記錄最后一個(gè)checkpoint(“l(fā)ast checkpoint LSN”),然后開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的數(shù)據(jù)文 件.ibd;在拷貝全部數(shù)據(jù)文件結(jié)束之后,才停止拷貝logfile。
因?yàn)閘ogfile里面記錄全部的數(shù)據(jù)修改情況,所以,即時(shí)在備份過程中數(shù)據(jù)文件被修改過了,恢復(fù)時(shí)仍然能夠通過解析xtrabackup_logfile保持?jǐn)?shù)據(jù)的一致。
C、Xtrabackup備份原理
XtraBackup基于InnoDB的crash-recovery功能。它會(huì)復(fù)制innodb的data file,由于不鎖表,復(fù)制出來的數(shù)據(jù)是不一致的,在恢復(fù)的時(shí)候使用crash-recovery,使得數(shù)據(jù)恢復(fù)一致。
InnoDB維護(hù)了一個(gè)redo log,又稱為transaction log,事務(wù)日志,它包含了innodb數(shù)據(jù)的所有改動(dòng)情況。當(dāng)InnoDB啟動(dòng)的時(shí)候,它會(huì)先去檢查data file和transaction log,并且會(huì)做二步操作:
XtraBackup在備份的時(shí)候, 一頁(yè)一頁(yè)地復(fù)制innodb的數(shù)據(jù),而且不鎖定表,與此同時(shí),XtraBackup還有另外一個(gè)線程監(jiān)視著transactions log,一旦log發(fā)生變化,就把變化過的log pages復(fù)制走。為什么要急著復(fù)制走呢? 因?yàn)閠ransactions log文件大小有限,寫滿之后,就會(huì)從頭再開始寫,所以新數(shù)據(jù)可能會(huì)覆蓋到舊的數(shù)據(jù)。
在prepare過程中,XtraBackup使用復(fù)制到的transactions log對(duì)備份出來的innodb data file進(jìn)行crash recovery。
D、實(shí)現(xiàn)細(xì)節(jié)
XtraBackup以read-write模式打開innodb的數(shù)據(jù)文件,然后對(duì)其進(jìn)行復(fù)制。其實(shí)它不會(huì)修改此文件。也就是說,運(yùn)行 XtraBackup的用戶,必須對(duì)innodb的數(shù)據(jù)文件具有讀寫權(quán)限。之所以采用read-write模式是因?yàn)閄traBackup采用了其內(nèi)置的 innodb庫(kù)來打開文件,而innodb庫(kù)打開文件的時(shí)候就是rw的。
XtraBackup要從文件系統(tǒng)中復(fù)制大量的數(shù)據(jù),所以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數(shù)據(jù),從 而提升性能。因?yàn)檫@些數(shù)據(jù)不會(huì)重用到了,OS卻沒有這么聰明。如果要緩存一下的話,幾個(gè)G的數(shù)據(jù),會(huì)對(duì)OS的虛擬內(nèi)存造成很大的壓力,其它進(jìn)程,比如 mysqld很有可能被swap出去,這樣系統(tǒng)就會(huì)受到很大影響了。
在備份innodb page的過程中,XtraBackup每次讀寫1MB的數(shù)據(jù),1MB/16KB=64個(gè)page。這個(gè)不可配置。讀1MB數(shù)據(jù)之 后,XtraBackup一頁(yè)一頁(yè)地遍歷這1MB數(shù)據(jù),使用innodb的buf_page_is_corrupted()函數(shù)檢查此頁(yè)的數(shù)據(jù)是否正常, 如果數(shù)據(jù)不正常,就重新讀取這一頁(yè),最多重新讀取10次,如果還是失敗,備份就失敗了,退出。在復(fù)制transactions log的時(shí)候,每次讀寫512KB的數(shù)據(jù)。同樣不可以配置。
二、Xtrabackup安裝
本文通過源碼方式安裝Xtrabackup,最新的版本是1.6.
Xtrabackup與一般的源碼構(gòu)建方式不同,它采用的在MySQL源代碼上打補(bǔ)丁的構(gòu)建方式。下載的源碼包比較大就是是因?yàn)檫@個(gè)包里打包了編譯需要的兩個(gè)MySQL Source,一個(gè)5.1.56,一個(gè)5.5.10。
安裝編譯所需的依賴包
BASH
yum install libaio libaio-devel
編譯安裝Xtrabackup
BASH
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6/source/xtrabackup-1.6.tar.gz
tar xvf xtrabackup-1.6.tar.gz
cd xtrabackup-1.6
utils/build.sh innodb55
注:build.sh是源碼包中提供的編譯腳本,MySQL 5.1可用參數(shù)innodb51_builtin。
編譯成功后,會(huì)在對(duì)應(yīng)mysql版本目錄中生成一個(gè)xtrabackup程序,我這里生成的路徑是mysql-5.5.10/storage/innobase/xtrabackup/中
BASH
ls mysql-5.5.10/storage/innobase/xtrabackup/
Makefile xtrabackup.c xtrabackup_innodb55 xtrabackup.o
復(fù)制相應(yīng)文件和建立軟鏈到/usr/bin下,這么做的原因是滿足innobackupex腳本的需要。
BASH
cp mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/bin/xtrabackup_55
cp innobackupex /usr/bin/innobackupex
#備份時(shí)如果打包就需要這個(gè)命令,非必需。
cp libtar-1.2.11/libtar/tar4ibd /usr/bin/tar4ibd
ln -sf /usr/local/webserver/mysql/bin/mysql /usr/bin/mysql
三.Xtrabackup的備份與恢復(fù)使用
A、Xtrabackup常用參數(shù)選項(xiàng)如下:
BASH
--defaults-file=#
默認(rèn)配置文件的路徑,如果不該參數(shù),xtrabackup將從依次從以下位置查找配置文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并讀取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只需要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6個(gè)參數(shù)即可讓xtrabackup正常工作。
--defaults-extra-file=#
如果使用了該參數(shù),在讀取了全局配置文件之后,會(huì)再讀取這里指定的配置文件
--target-dir=name
備份文件的存放目錄路徑
--backup
實(shí)施備份到target-dir
--prepare
實(shí)施對(duì)備份文件進(jìn)行恢復(fù)前的準(zhǔn)備(生成InnoDB log file)
--print-param
打印備份或恢復(fù)時(shí)需要的參數(shù)
--use-memory=#
該參數(shù)在 prepare 的時(shí)候使用,控制prepare時(shí)innodb實(shí)例使用的內(nèi)存量
--suspend-at-end
在target-dir目錄下產(chǎn)生一個(gè)xtrabackup_suspended文件,將xtrabackup進(jìn)程掛起,不停地將數(shù)據(jù)文件的變化同步到備份文件,直到用戶手工刪除xtrabackup_suspended文件
--throttle=#
每秒IO次數(shù),限制backup時(shí)使用的I/O操作量,使備份對(duì)數(shù)據(jù)庫(kù)正常業(yè)務(wù)的影響最小化
--log-stream
該參數(shù)在backup的時(shí)候使用,將xtrabackup_logfile的內(nèi)容輸出到標(biāo)準(zhǔn)輸出,使用該參數(shù)時(shí)會(huì)自動(dòng)使用suspend-at-end參數(shù),innobackupex腳本的stream 模式會(huì)使用該參數(shù)。
--incremental-lsn=name
增量備份時(shí)只拷貝LSN比該參數(shù)指定值新的ibd pages,前次備份到了哪個(gè)LSN可以看前次備份集的xtrabackup_checkpoints文件
--incremental-basedir=name
該參數(shù)在backup的時(shí)候使用,備份比該參數(shù)指定位置的備份集新的idb pages
--incremental-dir=name
該參數(shù)在prepare的時(shí)候使用,指定prepare時(shí)產(chǎn)生的.delta 文件和日志文件的存放路徑
--tables=name
在備份file-per-table類型的數(shù)據(jù)文件時(shí)使用,使用正則表達(dá)式指定需要備份的innodb表
--datadir=name
MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)文件目錄。
B、普通備份方式
a)普通備份(全量備份)
BASH
mkdir -p /data0/backup/mysql
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/
cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/
注意:xtrabackup只備份數(shù)據(jù)文件,并不備份數(shù)據(jù)表結(jié)構(gòu)(.frm),所以這里要手動(dòng)備份一下,以便xtrabackup恢復(fù)的時(shí)候使用。
全量備份恢復(fù)
實(shí)施對(duì)備份文件進(jìn)行恢復(fù)前的準(zhǔn)備
BASH
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/
從備份目錄復(fù)制對(duì)應(yīng)數(shù)據(jù)庫(kù)表結(jié)構(gòu)到默認(rèn)的數(shù)據(jù)目錄
BASH
cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/
刪除默認(rèn)數(shù)據(jù)目錄中對(duì)應(yīng)的數(shù)據(jù)文件并復(fù)制備份的數(shù)據(jù)文件到默認(rèn)數(shù)據(jù)目錄
BASH
rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/
修改數(shù)據(jù)目錄權(quán)限
BASH
chown -R mysql:mysql /data0/mysql/data
重啟MySQL
BASH
/data0/mysql/mysql restart
b)增量備份
增量備份優(yōu)點(diǎn):
1、數(shù)據(jù)庫(kù)太大沒有足夠的空間全量備份,作增量備份有效節(jié)省空間,且效率高。
2、支持熱備份。備份過程不鎖表,不受時(shí)間限制,不影響用戶使用。
3、每日備份只產(chǎn)生少量數(shù)據(jù),遠(yuǎn)程備份傳輸更方便。同時(shí)節(jié)省空間。
4、備份恢復(fù)基于文件操作,降低直接對(duì)數(shù)據(jù)庫(kù)操作風(fēng)險(xiǎn)。
5、備份效率更高,恢復(fù)效率更高。
這個(gè)我研究N久沒成功,原因暫時(shí)還沒找到。我測(cè)試環(huán)境的Mysql版本是5.5.11的,xtrabackup_55是根據(jù)MySQL5.5.9的源碼編譯的,不知道和這個(gè)有關(guān)系沒?待驗(yàn)證!這里只把實(shí)現(xiàn)步驟整理出來。
增量備份及模擬恢復(fù)步驟:
先做一次全量備份,增量備份需要以此為基礎(chǔ)
BASH
#建立備份目錄
mkdir -p /data0/backup/mysql/base
#建立一個(gè)全量備份
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/base
#生成的備份數(shù)據(jù)文件
ls /data0/backup/mysql/base/
ibdata1 xtrabackup_checkpoints xtrabackup_logfile
#備份數(shù)據(jù)庫(kù)表結(jié)構(gòu)
cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/
以此全量備份為基礎(chǔ)進(jìn)行增量備份
BASH
#建立備份目錄
mkdir -p /data0/backup/mysql/delta
#建立一個(gè)增量備份
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/delta --incremental-basedir=/data0/backup/mysql/base
#生成的備份數(shù)據(jù)文件
ls /data0/backup/mysql/delta/
ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile
注:在增量備份目錄下,數(shù)據(jù)文件都是以.delta結(jié)尾的。增量備份只備份上一次全量備份后被修改過的page,所以增量備份只暫用較少的空 間。增量備份可以在增量備份的基礎(chǔ)上增量。增量備份目錄每次都需修改的。比如第二次增量就改成/data0/backup/mysql/delta2)
增量備份恢復(fù)過程:
首先需要分別對(duì)全量、增量備份各做一次prepare操作。
BASH
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base --incremental-dir=/data0/backup/mysql/delta/
從備份目錄復(fù)制對(duì)應(yīng)數(shù)據(jù)庫(kù)表結(jié)構(gòu)到默認(rèn)的數(shù)據(jù)目錄
BASH
cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/
刪除默認(rèn)數(shù)據(jù)目錄中對(duì)應(yīng)的數(shù)據(jù)文件并復(fù)制備份的數(shù)據(jù)文件到默認(rèn)數(shù)據(jù)目錄
BASH
rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/
修改數(shù)據(jù)目錄權(quán)限
BASH
chown -R mysql:mysql /data0/mysql/data
重啟MySQL
BASH
/data0/mysql/mysql restart
四、innobackupex的備份與恢復(fù)使用
A、數(shù)據(jù)備份
通常一般都直接使用innobackupex,因?yàn)樗芡瑫r(shí)備份InnoDB和MyISAM引擎的表。要注意的是my.cnf里datadir這個(gè)參數(shù)是必須要指定的,xtrabackup_55是根據(jù)它去定位innodb數(shù)據(jù)文件的位置。
innobackupex語(yǔ)法
BASH
innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [--password=WORD]
[--port=PORT] [--socket=SOCKET] [--no-timestamp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]
[--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR
innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR
innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR
各參數(shù)說明:
--defaults-file
同xtrabackup的--defaults-file參數(shù)
--apply-log
對(duì)xtrabackup的--prepare參數(shù)的封裝
--copy-back
做數(shù)據(jù)恢復(fù)時(shí)將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir ;
--remote-host=HOSTNAME
通過ssh將備份數(shù)據(jù)存儲(chǔ)到進(jìn)程服務(wù)器上;
--stream=[tar]
備份文件輸出格式, tar時(shí)使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時(shí)有指定--stream=tar, 則tar4ibd文件所處目錄一定要在$PATH中(因?yàn)槭褂玫氖莟ar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)。
在使用參數(shù)stream=tar備份的時(shí)候,你的xtrabackup_logfile可能會(huì)臨時(shí)放在/tmp目錄下,如果你備份的時(shí)候并發(fā)寫入較大的話xtrabackup_logfile可能會(huì)很大(5G+),很可能會(huì)撐滿你的/tmp目錄,可以通過參數(shù)--tmpdir指定目錄來解決這個(gè)問題。
--tmpdir=DIRECTORY
當(dāng)有指定--remote-host or --stream時(shí), 事務(wù)日志臨時(shí)存儲(chǔ)的目錄, 默認(rèn)采用MySQL配置文件中所指定的臨時(shí)目錄tmpdir
--redo-only --apply-log組,
強(qiáng)制備份日志時(shí)只redo ,跳過rollback。這在做增量備份時(shí)非常必要。
--use-memory=#
該參數(shù)在prepare的時(shí)候使用,控制prepare時(shí)innodb實(shí)例使用的內(nèi)存量
--throttle=IOS
同xtrabackup的--throttle參數(shù)
--sleep=是給ibbackup使用的,指定每備份1M數(shù)據(jù),過程停止拷貝多少毫秒,也是為了在備份時(shí)盡量減小對(duì)正常業(yè)務(wù)的影響,具體可以查看ibbackup的手冊(cè) ;
--compress[=LEVEL]
對(duì)備份數(shù)據(jù)迚行壓縮,僅支持ibbackup,xtrabackup還沒有實(shí)現(xiàn);
--include=REGEXP
對(duì)xtrabackup參數(shù)--tables的封裝,也支持ibbackup。備份包含的庫(kù)表,例如:--include="test.*",意思是要備份test庫(kù)中所有的表。如果需要全備份,則省略這個(gè)參數(shù);如果需要備份test庫(kù)下的2個(gè)表:test1和test2,則寫成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST
列出需要備份的databases,如果沒有指定該參數(shù),所有包含MyISAM和InnoDB表的database都會(huì)被備份;
--uncompress
解壓備份的數(shù)據(jù)文件,支持ibbackup,xtrabackup還沒有實(shí)現(xiàn)該功能;
--slave-info,
備份從庫(kù), 加上--slave-info備份目錄下會(huì)多生成一個(gè)xtrabackup_slave_info 文件, 這里會(huì)保存主日志文件以及偏移, 文件內(nèi)容類似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便備份進(jìn)程登錄mysql.
備份前首先所需要建立一個(gè)備份所需的目錄
BASH
mkdir -p /data0/backup/mysql
1、普通備份
BASH
innobackupex --database="testinnodb test" --user=root --no-lock --defaults-file=/data0/mysql/my.cnf /data0/backup/mysql 2>/tmp/mysqlbackup.log
注:使用mysql的root用戶將數(shù)據(jù)庫(kù)testinnodb和test的備份,備份路徑是/data0/backup/mysql/。備份 成功后會(huì)在該目錄下將創(chuàng)建以時(shí)間戳為名稱的備份目錄。no-lock參數(shù)用于指定備份時(shí)不鎖定表。2>/tmp/mysqlbackup.log是 將備份過程中的輸出信息保存到/tmp/mysqlbackup.log中。
2、打包備份
BASH
innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log 1>/data0/backup/mysql/mike.tar
注:這種備份時(shí)間會(huì)比較長(zhǎng),主要是執(zhí)行壓縮操作。這種方式打的包需要使用tar izxvf解壓。參數(shù)-i是必須加上的。
3、壓縮備份
BASH
innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log|gzip>/data0/backup/mysql/mike.tar.gz
4、備份到遠(yuǎn)程服務(wù)器
備份當(dāng)前機(jī)器下的數(shù)據(jù)到192.168.1.101的/data0/目錄下。
BASH
innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/|ssh root@192.168.1.101 cat ">"/data0/backup.tar
B、數(shù)據(jù)恢復(fù)
以壓縮后的備份數(shù)據(jù)為例,普通備份和打包備份的恢復(fù)方法和這個(gè)類似,就不在舉例了。
解包備份數(shù)據(jù)
BASH
tar xvzfi mike.tar.gz
指定恢復(fù)備份所需的xtrabackup_logfile文件的目錄
BASH
innobackupex --apply-log --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql
從備份目錄拷貝數(shù)據(jù)、索引、日志到my.cnf文件里規(guī)定初始的數(shù)據(jù)目錄位置。
BASH
innobackupex --copy-back --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql
修改數(shù)據(jù)目錄權(quán)限
BASH
chown -R mysql:mysql /data0/mysql/data
重啟MySQL
BASH
/data0/mysql/mysql restart
五、參考文檔
http://www.google.com
http://www.linuxidc.com/Linux/2011-05/35410.htm
http://blogold.chinaunix.net/u4/122567/showart_2537465.html
A、Xtrabackup是什么
Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品。
Xtrabackup有兩個(gè)主要的工具:xtrabackup、innobackupex
1、xtrabackup只能備份InnoDB和XtraDB兩種數(shù)據(jù)表,而不能備份MyISAM數(shù)據(jù)表
2、innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個(gè)perl腳本封裝,封裝了xtrabackup。主要是為了方便的 同時(shí)備份InnoDB和MyISAM引擎的表,但在處理myisam時(shí)需要加一個(gè)讀鎖。并且加入了一些使用的選項(xiàng)。如slave-info可以記錄備份恢 復(fù)后,作為slave需要的一些信息,根據(jù)這些信息,可以很方便的利用備份來重做slave。
3、官方文檔:http://www.percona.com/docs/wiki/percona-xtrabackup:start
B、Xtrabackup可以做什么
在線(熱)備份整個(gè)庫(kù)的InnoDB、 XtraDB表
在xtrabackup的上一次整庫(kù)備份基礎(chǔ)上做增量備份(innodb only)
以流的形式產(chǎn)生備份,可以直接保存到遠(yuǎn)程機(jī)器上(本機(jī)硬盤空間不足時(shí)很有用)
MySQL數(shù)據(jù)庫(kù)本身提供的工具并不支持真正的增量備份,二進(jìn)制日志恢復(fù)是point-in-time(時(shí)間點(diǎn))的恢復(fù)而不是增量備份。Xtrabackup工具支持對(duì)InnoDB存儲(chǔ)引擎的增量備份,工作原理如下:
(1)首先完成一個(gè)完全備份,并記錄下此時(shí)檢查點(diǎn)的LSN(Log Sequence Number)。
(2)在進(jìn)程增量備份時(shí),比較表空間中每個(gè)頁(yè)的LSN是否大于上次備份時(shí)的LSN,如果是,則備份該頁(yè),同時(shí)記錄當(dāng)前檢查點(diǎn)的LSN。
首先,在logfile中找到并記錄最后一個(gè)checkpoint(“l(fā)ast checkpoint LSN”),然后開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的數(shù)據(jù)文 件.ibd;在拷貝全部數(shù)據(jù)文件結(jié)束之后,才停止拷貝logfile。
因?yàn)閘ogfile里面記錄全部的數(shù)據(jù)修改情況,所以,即時(shí)在備份過程中數(shù)據(jù)文件被修改過了,恢復(fù)時(shí)仍然能夠通過解析xtrabackup_logfile保持?jǐn)?shù)據(jù)的一致。
C、Xtrabackup備份原理
XtraBackup基于InnoDB的crash-recovery功能。它會(huì)復(fù)制innodb的data file,由于不鎖表,復(fù)制出來的數(shù)據(jù)是不一致的,在恢復(fù)的時(shí)候使用crash-recovery,使得數(shù)據(jù)恢復(fù)一致。
InnoDB維護(hù)了一個(gè)redo log,又稱為transaction log,事務(wù)日志,它包含了innodb數(shù)據(jù)的所有改動(dòng)情況。當(dāng)InnoDB啟動(dòng)的時(shí)候,它會(huì)先去檢查data file和transaction log,并且會(huì)做二步操作:
XtraBackup在備份的時(shí)候, 一頁(yè)一頁(yè)地復(fù)制innodb的數(shù)據(jù),而且不鎖定表,與此同時(shí),XtraBackup還有另外一個(gè)線程監(jiān)視著transactions log,一旦log發(fā)生變化,就把變化過的log pages復(fù)制走。為什么要急著復(fù)制走呢? 因?yàn)閠ransactions log文件大小有限,寫滿之后,就會(huì)從頭再開始寫,所以新數(shù)據(jù)可能會(huì)覆蓋到舊的數(shù)據(jù)。
在prepare過程中,XtraBackup使用復(fù)制到的transactions log對(duì)備份出來的innodb data file進(jìn)行crash recovery。
D、實(shí)現(xiàn)細(xì)節(jié)
XtraBackup以read-write模式打開innodb的數(shù)據(jù)文件,然后對(duì)其進(jìn)行復(fù)制。其實(shí)它不會(huì)修改此文件。也就是說,運(yùn)行 XtraBackup的用戶,必須對(duì)innodb的數(shù)據(jù)文件具有讀寫權(quán)限。之所以采用read-write模式是因?yàn)閄traBackup采用了其內(nèi)置的 innodb庫(kù)來打開文件,而innodb庫(kù)打開文件的時(shí)候就是rw的。
XtraBackup要從文件系統(tǒng)中復(fù)制大量的數(shù)據(jù),所以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數(shù)據(jù),從 而提升性能。因?yàn)檫@些數(shù)據(jù)不會(huì)重用到了,OS卻沒有這么聰明。如果要緩存一下的話,幾個(gè)G的數(shù)據(jù),會(huì)對(duì)OS的虛擬內(nèi)存造成很大的壓力,其它進(jìn)程,比如 mysqld很有可能被swap出去,這樣系統(tǒng)就會(huì)受到很大影響了。
在備份innodb page的過程中,XtraBackup每次讀寫1MB的數(shù)據(jù),1MB/16KB=64個(gè)page。這個(gè)不可配置。讀1MB數(shù)據(jù)之 后,XtraBackup一頁(yè)一頁(yè)地遍歷這1MB數(shù)據(jù),使用innodb的buf_page_is_corrupted()函數(shù)檢查此頁(yè)的數(shù)據(jù)是否正常, 如果數(shù)據(jù)不正常,就重新讀取這一頁(yè),最多重新讀取10次,如果還是失敗,備份就失敗了,退出。在復(fù)制transactions log的時(shí)候,每次讀寫512KB的數(shù)據(jù)。同樣不可以配置。
二、Xtrabackup安裝
本文通過源碼方式安裝Xtrabackup,最新的版本是1.6.
Xtrabackup與一般的源碼構(gòu)建方式不同,它采用的在MySQL源代碼上打補(bǔ)丁的構(gòu)建方式。下載的源碼包比較大就是是因?yàn)檫@個(gè)包里打包了編譯需要的兩個(gè)MySQL Source,一個(gè)5.1.56,一個(gè)5.5.10。
安裝編譯所需的依賴包
BASH
yum install libaio libaio-devel
編譯安裝Xtrabackup
BASH
復(fù)制代碼 代碼如下:
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6/source/xtrabackup-1.6.tar.gz
tar xvf xtrabackup-1.6.tar.gz
cd xtrabackup-1.6
utils/build.sh innodb55
注:build.sh是源碼包中提供的編譯腳本,MySQL 5.1可用參數(shù)innodb51_builtin。
編譯成功后,會(huì)在對(duì)應(yīng)mysql版本目錄中生成一個(gè)xtrabackup程序,我這里生成的路徑是mysql-5.5.10/storage/innobase/xtrabackup/中
BASH
ls mysql-5.5.10/storage/innobase/xtrabackup/
Makefile xtrabackup.c xtrabackup_innodb55 xtrabackup.o
復(fù)制相應(yīng)文件和建立軟鏈到/usr/bin下,這么做的原因是滿足innobackupex腳本的需要。
BASH
復(fù)制代碼 代碼如下:
cp mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/bin/xtrabackup_55
cp innobackupex /usr/bin/innobackupex
#備份時(shí)如果打包就需要這個(gè)命令,非必需。
cp libtar-1.2.11/libtar/tar4ibd /usr/bin/tar4ibd
ln -sf /usr/local/webserver/mysql/bin/mysql /usr/bin/mysql
三.Xtrabackup的備份與恢復(fù)使用
A、Xtrabackup常用參數(shù)選項(xiàng)如下:
BASH
--defaults-file=#
默認(rèn)配置文件的路徑,如果不該參數(shù),xtrabackup將從依次從以下位置查找配置文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并讀取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只需要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6個(gè)參數(shù)即可讓xtrabackup正常工作。
--defaults-extra-file=#
如果使用了該參數(shù),在讀取了全局配置文件之后,會(huì)再讀取這里指定的配置文件
--target-dir=name
備份文件的存放目錄路徑
--backup
實(shí)施備份到target-dir
--prepare
實(shí)施對(duì)備份文件進(jìn)行恢復(fù)前的準(zhǔn)備(生成InnoDB log file)
--print-param
打印備份或恢復(fù)時(shí)需要的參數(shù)
--use-memory=#
該參數(shù)在 prepare 的時(shí)候使用,控制prepare時(shí)innodb實(shí)例使用的內(nèi)存量
--suspend-at-end
在target-dir目錄下產(chǎn)生一個(gè)xtrabackup_suspended文件,將xtrabackup進(jìn)程掛起,不停地將數(shù)據(jù)文件的變化同步到備份文件,直到用戶手工刪除xtrabackup_suspended文件
--throttle=#
每秒IO次數(shù),限制backup時(shí)使用的I/O操作量,使備份對(duì)數(shù)據(jù)庫(kù)正常業(yè)務(wù)的影響最小化
--log-stream
該參數(shù)在backup的時(shí)候使用,將xtrabackup_logfile的內(nèi)容輸出到標(biāo)準(zhǔn)輸出,使用該參數(shù)時(shí)會(huì)自動(dòng)使用suspend-at-end參數(shù),innobackupex腳本的stream 模式會(huì)使用該參數(shù)。
--incremental-lsn=name
增量備份時(shí)只拷貝LSN比該參數(shù)指定值新的ibd pages,前次備份到了哪個(gè)LSN可以看前次備份集的xtrabackup_checkpoints文件
--incremental-basedir=name
該參數(shù)在backup的時(shí)候使用,備份比該參數(shù)指定位置的備份集新的idb pages
--incremental-dir=name
該參數(shù)在prepare的時(shí)候使用,指定prepare時(shí)產(chǎn)生的.delta 文件和日志文件的存放路徑
--tables=name
在備份file-per-table類型的數(shù)據(jù)文件時(shí)使用,使用正則表達(dá)式指定需要備份的innodb表
--datadir=name
MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)文件目錄。
B、普通備份方式
a)普通備份(全量備份)
BASH
復(fù)制代碼 代碼如下:
mkdir -p /data0/backup/mysql
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/
cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/
注意:xtrabackup只備份數(shù)據(jù)文件,并不備份數(shù)據(jù)表結(jié)構(gòu)(.frm),所以這里要手動(dòng)備份一下,以便xtrabackup恢復(fù)的時(shí)候使用。
全量備份恢復(fù)
實(shí)施對(duì)備份文件進(jìn)行恢復(fù)前的準(zhǔn)備
BASH
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/
從備份目錄復(fù)制對(duì)應(yīng)數(shù)據(jù)庫(kù)表結(jié)構(gòu)到默認(rèn)的數(shù)據(jù)目錄
BASH
cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/
刪除默認(rèn)數(shù)據(jù)目錄中對(duì)應(yīng)的數(shù)據(jù)文件并復(fù)制備份的數(shù)據(jù)文件到默認(rèn)數(shù)據(jù)目錄
BASH
rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/
修改數(shù)據(jù)目錄權(quán)限
BASH
chown -R mysql:mysql /data0/mysql/data
重啟MySQL
BASH
/data0/mysql/mysql restart
b)增量備份
增量備份優(yōu)點(diǎn):
1、數(shù)據(jù)庫(kù)太大沒有足夠的空間全量備份,作增量備份有效節(jié)省空間,且效率高。
2、支持熱備份。備份過程不鎖表,不受時(shí)間限制,不影響用戶使用。
3、每日備份只產(chǎn)生少量數(shù)據(jù),遠(yuǎn)程備份傳輸更方便。同時(shí)節(jié)省空間。
4、備份恢復(fù)基于文件操作,降低直接對(duì)數(shù)據(jù)庫(kù)操作風(fēng)險(xiǎn)。
5、備份效率更高,恢復(fù)效率更高。
這個(gè)我研究N久沒成功,原因暫時(shí)還沒找到。我測(cè)試環(huán)境的Mysql版本是5.5.11的,xtrabackup_55是根據(jù)MySQL5.5.9的源碼編譯的,不知道和這個(gè)有關(guān)系沒?待驗(yàn)證!這里只把實(shí)現(xiàn)步驟整理出來。
增量備份及模擬恢復(fù)步驟:
先做一次全量備份,增量備份需要以此為基礎(chǔ)
BASH
復(fù)制代碼 代碼如下:
#建立備份目錄
mkdir -p /data0/backup/mysql/base
#建立一個(gè)全量備份
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/base
#生成的備份數(shù)據(jù)文件
ls /data0/backup/mysql/base/
ibdata1 xtrabackup_checkpoints xtrabackup_logfile
#備份數(shù)據(jù)庫(kù)表結(jié)構(gòu)
cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/
以此全量備份為基礎(chǔ)進(jìn)行增量備份
BASH
復(fù)制代碼 代碼如下:
#建立備份目錄
mkdir -p /data0/backup/mysql/delta
#建立一個(gè)增量備份
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/delta --incremental-basedir=/data0/backup/mysql/base
#生成的備份數(shù)據(jù)文件
ls /data0/backup/mysql/delta/
ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile
注:在增量備份目錄下,數(shù)據(jù)文件都是以.delta結(jié)尾的。增量備份只備份上一次全量備份后被修改過的page,所以增量備份只暫用較少的空 間。增量備份可以在增量備份的基礎(chǔ)上增量。增量備份目錄每次都需修改的。比如第二次增量就改成/data0/backup/mysql/delta2)
增量備份恢復(fù)過程:
首先需要分別對(duì)全量、增量備份各做一次prepare操作。
BASH
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base --incremental-dir=/data0/backup/mysql/delta/
從備份目錄復(fù)制對(duì)應(yīng)數(shù)據(jù)庫(kù)表結(jié)構(gòu)到默認(rèn)的數(shù)據(jù)目錄
BASH
cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/
刪除默認(rèn)數(shù)據(jù)目錄中對(duì)應(yīng)的數(shù)據(jù)文件并復(fù)制備份的數(shù)據(jù)文件到默認(rèn)數(shù)據(jù)目錄
BASH
rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/
修改數(shù)據(jù)目錄權(quán)限
BASH
chown -R mysql:mysql /data0/mysql/data
重啟MySQL
BASH
/data0/mysql/mysql restart
四、innobackupex的備份與恢復(fù)使用
A、數(shù)據(jù)備份
通常一般都直接使用innobackupex,因?yàn)樗芡瑫r(shí)備份InnoDB和MyISAM引擎的表。要注意的是my.cnf里datadir這個(gè)參數(shù)是必須要指定的,xtrabackup_55是根據(jù)它去定位innodb數(shù)據(jù)文件的位置。
innobackupex語(yǔ)法
BASH
innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [--password=WORD]
[--port=PORT] [--socket=SOCKET] [--no-timestamp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]
[--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR
innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR
innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR
各參數(shù)說明:
--defaults-file
同xtrabackup的--defaults-file參數(shù)
--apply-log
對(duì)xtrabackup的--prepare參數(shù)的封裝
--copy-back
做數(shù)據(jù)恢復(fù)時(shí)將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir ;
--remote-host=HOSTNAME
通過ssh將備份數(shù)據(jù)存儲(chǔ)到進(jìn)程服務(wù)器上;
--stream=[tar]
備份文件輸出格式, tar時(shí)使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時(shí)有指定--stream=tar, 則tar4ibd文件所處目錄一定要在$PATH中(因?yàn)槭褂玫氖莟ar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)。
在使用參數(shù)stream=tar備份的時(shí)候,你的xtrabackup_logfile可能會(huì)臨時(shí)放在/tmp目錄下,如果你備份的時(shí)候并發(fā)寫入較大的話xtrabackup_logfile可能會(huì)很大(5G+),很可能會(huì)撐滿你的/tmp目錄,可以通過參數(shù)--tmpdir指定目錄來解決這個(gè)問題。
--tmpdir=DIRECTORY
當(dāng)有指定--remote-host or --stream時(shí), 事務(wù)日志臨時(shí)存儲(chǔ)的目錄, 默認(rèn)采用MySQL配置文件中所指定的臨時(shí)目錄tmpdir
--redo-only --apply-log組,
強(qiáng)制備份日志時(shí)只redo ,跳過rollback。這在做增量備份時(shí)非常必要。
--use-memory=#
該參數(shù)在prepare的時(shí)候使用,控制prepare時(shí)innodb實(shí)例使用的內(nèi)存量
--throttle=IOS
同xtrabackup的--throttle參數(shù)
--sleep=是給ibbackup使用的,指定每備份1M數(shù)據(jù),過程停止拷貝多少毫秒,也是為了在備份時(shí)盡量減小對(duì)正常業(yè)務(wù)的影響,具體可以查看ibbackup的手冊(cè) ;
--compress[=LEVEL]
對(duì)備份數(shù)據(jù)迚行壓縮,僅支持ibbackup,xtrabackup還沒有實(shí)現(xiàn);
--include=REGEXP
對(duì)xtrabackup參數(shù)--tables的封裝,也支持ibbackup。備份包含的庫(kù)表,例如:--include="test.*",意思是要備份test庫(kù)中所有的表。如果需要全備份,則省略這個(gè)參數(shù);如果需要備份test庫(kù)下的2個(gè)表:test1和test2,則寫成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST
列出需要備份的databases,如果沒有指定該參數(shù),所有包含MyISAM和InnoDB表的database都會(huì)被備份;
--uncompress
解壓備份的數(shù)據(jù)文件,支持ibbackup,xtrabackup還沒有實(shí)現(xiàn)該功能;
--slave-info,
備份從庫(kù), 加上--slave-info備份目錄下會(huì)多生成一個(gè)xtrabackup_slave_info 文件, 這里會(huì)保存主日志文件以及偏移, 文件內(nèi)容類似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便備份進(jìn)程登錄mysql.
備份前首先所需要建立一個(gè)備份所需的目錄
BASH
mkdir -p /data0/backup/mysql
1、普通備份
BASH
innobackupex --database="testinnodb test" --user=root --no-lock --defaults-file=/data0/mysql/my.cnf /data0/backup/mysql 2>/tmp/mysqlbackup.log
注:使用mysql的root用戶將數(shù)據(jù)庫(kù)testinnodb和test的備份,備份路徑是/data0/backup/mysql/。備份 成功后會(huì)在該目錄下將創(chuàng)建以時(shí)間戳為名稱的備份目錄。no-lock參數(shù)用于指定備份時(shí)不鎖定表。2>/tmp/mysqlbackup.log是 將備份過程中的輸出信息保存到/tmp/mysqlbackup.log中。
2、打包備份
BASH
innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log 1>/data0/backup/mysql/mike.tar
注:這種備份時(shí)間會(huì)比較長(zhǎng),主要是執(zhí)行壓縮操作。這種方式打的包需要使用tar izxvf解壓。參數(shù)-i是必須加上的。
3、壓縮備份
BASH
innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log|gzip>/data0/backup/mysql/mike.tar.gz
4、備份到遠(yuǎn)程服務(wù)器
備份當(dāng)前機(jī)器下的數(shù)據(jù)到192.168.1.101的/data0/目錄下。
BASH
innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/|ssh root@192.168.1.101 cat ">"/data0/backup.tar
B、數(shù)據(jù)恢復(fù)
以壓縮后的備份數(shù)據(jù)為例,普通備份和打包備份的恢復(fù)方法和這個(gè)類似,就不在舉例了。
解包備份數(shù)據(jù)
BASH
tar xvzfi mike.tar.gz
指定恢復(fù)備份所需的xtrabackup_logfile文件的目錄
BASH
innobackupex --apply-log --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql
從備份目錄拷貝數(shù)據(jù)、索引、日志到my.cnf文件里規(guī)定初始的數(shù)據(jù)目錄位置。
BASH
innobackupex --copy-back --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql
修改數(shù)據(jù)目錄權(quán)限
BASH
chown -R mysql:mysql /data0/mysql/data
重啟MySQL
BASH
/data0/mysql/mysql restart
五、參考文檔
http://www.google.com
http://www.linuxidc.com/Linux/2011-05/35410.htm
http://blogold.chinaunix.net/u4/122567/showart_2537465.html
您可能感興趣的文章:
- MySQL使用xtrabackup進(jìn)行備份還原操作
- 使用xtrabackup實(shí)現(xiàn)mysql備份
- 安裝使用Percona XtraBackup來備份恢復(fù)MySQL的教程
- 編寫腳本令Xtrabackup對(duì)MySQL數(shù)據(jù)進(jìn)行備份的教程
- MySQL中使用innobackupex、xtrabackup進(jìn)行大數(shù)據(jù)的備份和還原教程
- 利用Xtrabackup工具備份及恢復(fù)(MySQL DBA的必備工具)
- linux Xtrabackup安裝及使用方法
- mysql xtrabackup 備份恢復(fù)實(shí)現(xiàn)分享
- xtrabackup備份還原MySQL數(shù)據(jù)庫(kù)
相關(guān)文章
MySQL查看和修改事務(wù)隔離級(jí)別的實(shí)例講解
在本篇文章里小編給大家整理的是關(guān)于MySQL查看和修改事務(wù)隔離級(jí)別的實(shí)例講解,有興趣的朋友們學(xué)習(xí)下。2020-03-03MySQL數(shù)據(jù)庫(kù)之字符集?character
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之字符集?character,文章基于MySQL的的相關(guān)資料展開詳細(xì)介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下2022-05-05詳解MySQL數(shù)據(jù)庫(kù)之觸發(fā)器
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之觸發(fā)器的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2020-09-09淺談MySql整型索引和字符串索引失效或隱式轉(zhuǎn)換問題
本文主要介紹了MySql整型索引和字符串索引失效或隱式轉(zhuǎn)換問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11