2019年4月2日 星期二

【MYSQL】Percona XtraBackup 備份指令與還原





進行全量備份 (以日期來分,一天一個備份)
innobackupex [備份檔存放的路徑] --user=用戶名 --password=密碼 --socket=[sock路徑]
innobackupex /backup/20190402/ --user=root --password="1234" --socket=/tmp/mysql.sock
完成後會產出2019-04-02_14-01-36路徑在/backup/20190402/2019-04-02_14-01-36

進行增量備份
incremental-basedir路徑是第一次全備產出的檔案路徑,作為增量的基礎 
innobackupex --incremental /backup/20190402/ --incremental-basedir=/backup/20190402/2019-04-02_14-01-36/  --user=root --password="1234" --socket=/tmp/mysql.sock
完成後會產出2019-04-02_14-18-15路徑在/backup/20190402/2019-04-02_14-18-15





14-18-15是備份的時間點,進去資料夾內,可以查看xtrabackup_checkpoints是增量備份 
[root@rosalie 2019-04-02_14-18-15]# cat xtrabackup_checkpoints
backup_type = incremental ---incremental為增量、full-backuped為全量
from_lsn = 2591333
to_lsn = 2591333
last_lsn = 2591342
compact = 0
recover_binlog_info = 0


還原指令
innobackupex --apply-log --redo-only BASE_DIR
innobackupex --apply-log --redo-only BASE_DIR --incremental-dir = INCREMENTAL_DIR_1
innobackupex --apply-log BASE-DIR --incremental-dir = INCREMENTAL_DIR_2


其中BASE-DIR是指全量備份目錄(如下),增量DIR_1是指第一次的增量備份,增量DIR_2是指第二次的增量備份,以此類推這裡要注意的是:最後一步的增量備份並沒有--redo只選項!還有,可以使用--use_memory提高性能。


範例還原
第一步--apply-log應用備份時產生的日誌,為整體拷貝恢復做準備
innobackupex --apply-log --redo-only /backup/20190402/2019-04-02_14-01-36  --use-memory=500m --user=root --password='1234'
第二步-在準備備份(prepare)時,只執行重做(redo)階段
innobackupex --apply-log --redo-only /backup/20190402/2019-04-02_14-01-36
--incremental-dir=/backup/20190402/2019-04-02_14-18-15 --use-memory=500m
--user=root --password='1234'
/backup/20190402/2019-04-02_14-01-36 全備路徑
/backup/20190402/2019-04-02_14-18-15 增備路徑
若有第二次增量,藍色路徑更改為第二次增量路徑即可
第三步-上面執行完準備之後,這時2019-04-02_14-01-36裡的備份文件已完全準備就緒
innobackupex --apply-log  /backup/20190402/2019-04-02_14-01-36 --use-memory=500m --user=root --password='1234'

第四步-COPY 
copy方式1,執行下面指令,但原MYSQL資料夾需為空!
或者可直接mv 2019-04-02_14-01-36 到mysql指定的路徑下
方式1.
# innobackupex --copy-back /backup/20190402/2019-04-02_14-01-36 --use-memory=500m --user=root --password='1234'
# chown -R mysql:mysql /mysql/data/
方式2.
# cp /backup/20190402/2019-04-02_14-01-36 /mysql/
# mv 2019-04-02_14-01-36 data
# chown -R mysql:mysql /mysql/data/
若是增備後還有其他更新未備份,但有binlog檔案產生,需要再將數據導入可參考以下步驟


※注意,啟動後再導入
查看xtrabackup_binlog_info檔position位置最後的位置,再從那個位置開啟

[root@rosalie 2019-04-02_14-01-36]# cat xtrabackup_binlog_info
mysql-bin.000195 2861626|mysql -uroot -p

#從2861626開始到最後
[root@rosalie 2019-04-02_14-01-36]# mysqlbinlog --start-position=2861626 /restore_test/mysql-bin.00195 |mysql -uroot -p


#從2861626開啟到2900000
[root@rosalie 2019-04-02_14-01-36]# mysqlbinlog --start-position=2861626 --stop-position=2900000 /restore_test/mysql-bin.00195 |mysql -uroot -p

#復原整份BINLOG
[root@rosalie 2019-04-02_14-01-36]# mysqlbinlog  /restore_test/mysql-bin.00195 |mysql -uroot -p


執行若出現問題
ERROR 1062 (23000) at line 5073: Duplicate entry '2402120130098997002' for key 'PRIMARY'
ERROR 1062 (23000) at line 5097: Duplicate entry '163255337' for key 'PRIMARY'
ERROR 1062 (23000) at line 5267: Duplicate entry '163255338' for key 'PRIMARY'

可以加-f 略過
mysqlbinlog --start-position=2861626 /restore_test/mysql-bin.00195 | mysql -uroot -p -f

若出現 問題
mysqlbinlog: unknown variable 'default_character_set=utf8mb4'
可加--no-defaults --set-charset=utf8mb4
因為mysqlbinlog這個工具無法識別binlog中的配置中的default-character-set=utf8這個指令
mysqlbinlog --no-defaults --set-charset=utf8mb4 mysql-bin.00195 | mysql -uroot -p
XtraBackup參數說明(紅色是我覺得比較常會用到的)

  • --apply-log  
    該選項表示同xtrabackup的--prepare參數,一般情況下,在備份完成後,數據還不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。--apply-log(準備)的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態。
    對xtrabackup的--prepare參數的封裝
  • --backup-locks 
    僅支持percona server5.6,如果server不支持,開啟不讀私人和產生影響
  • --close-files 
    2.2.5引入的新特性
    關閉不再訪問的文件句柄,這個選項直接傳遞給xtrabackup,當xtrabackup打開表空間通常並不關閉文件句柄目的是正確的處理DDL操作。如果表空間數量巨大,這是一種可以關閉不再訪問的文件句柄的方法。使用該選項有風險,會有產生不一致備份的可能
  • --compact 
    創建一份沒有輔助索引的緊湊的備份,該選項直接傳遞給xtrabackup
  • --compress 
    該選項指導xtrabackup壓縮innodb數據文件的backup的拷貝,直接傳遞給xtrabackup的子進程
  • --compress-threads = # 
    該選項指定並行壓縮的worker線程的數量,直接傳遞給xtrabackup的子進程
  • --compress-chunk-size = # 
    這個選項指定每個壓縮線程的內部worker buffer的大小。單位是字節,默認是64K。直接傳遞給xtrabackup子進程
  • --copy-back 
    執行還原操作,從備份目錄中最近的一份備份中拷貝所有文件到datadir,innobackupex --copy-back選項除非指定innobackupex --force-non-empty-directories選項,否則不會拷貝覆蓋所有的文件
  • --databases=LIST 
    指定innoabckupex備份的DB列表,該選項接受一個一個字符串參數或者包含DB列表的文件的全路徑。如果沒有指定該選項,所有包含innodb和myam表的DB會被備份,請確認--databases包含所有的innodb數據庫和表,,以便所有的innodb.frm文件也同樣備份,如果列表非常長的話。可以以文件代替
  • --decompress 
    解壓所有值錢通過--compress選項壓縮成的.qp文件。innodbakcupex --parallel選項允許多個文件同時解壓。為了解壓,qpress工具必須有安裝並且訪問這個文件的權限。這個進程將在同一個位置移除原來的壓縮/加密文件
  • --decrypt=ENCRYPTION-ALGORITHM 
    解密所有之前通過--encrypt選項加密的.xbcrypt文件。--innobackup --parallel選項允許同時多個文件解密
  • --defaults-file=[MY.CNF] 
    該選項指定了從哪個文件讀取MySQL配置,必須放在命令行第一個選項的位置
  • --defaults-extra-file=[MY.CNF] 
    指定了在標準defaults-file之前從哪個額外的文件讀取MySQL配置,必須在命令行的第一個選項的位置
  • --default-group=GROUP-NAME 
    這個選項接受了一個字符串參數指定讀取配置文件的group,在一機多實例的時候需要指定
  • --encrypt=ENCRYPTION_ALGORITHM 
    該選項指定了xtrabackup通過ENCRYPTION_ALGORITHM的算法加密innodb數據文件的備份拷貝,該選項直接傳遞給xtrabackup子進程
  • --encrypt-key=ENCRYPTION_KEY 
    指導xtrabackup使用了--encrypt選項時候使用ENCRYPTION_KEY這個KEY,直接傳遞給xtrabackup子進程
  • --encrypt-key-file=ENCRYPTION_KEY_FILE 
    這個選項告訴xtrabackup使用--encrypt的時候。Key存在了ENCRYPTION_KEY_FILE這個文件中
  • --encrypt-chunk-size=# 
    這個選項指定了每個加密線程內部worker buffer的大小,單位字節,直接傳遞給xtrabackup子進程
  • --export=DIRECTORY 
    這個選項直接傳遞給xtrabackup --export選項。開啟可導出單獨的表之後再導入其他Mysql中
  • --extra-lsndir=DIRECTORY 
    這個選項接受一個字符串參數指定保存額外一份xtrabackup_checkpoints文件的目錄,直接傳遞給xtrabackup --extra-lsndir選項
  • --force-non-empty-directories 
    指定該參數時候,使得innobackupex --copy-back或innobackupex --move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋,如果--copy- back和--move-back文件需要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗
  • --galera-info 
    該選項生成了包含創建備份時候本地節點狀態的文件xtrabackup_galera_info文件,該選項只適用於備份PXC。
  • --history=NAME 
    percona server5.6的備份歷史記錄在percona_schema.xtrabackup_history表
  • --host=HOST 
    選項指定了TCP/IP連接的數據庫實例IP
  • --ibbackup=IBBACKUP-BINARY 
    這個選項指定了使用哪個xtrabackup二進製程序。IBBACKUP-BINARY是運行percona xtrabackup的命令,。這個選項適用於xtrbackup二進制不在你是搜索和工作目錄,如果指定了該選項,innoabackupex自動決定用的二進製程序
  • --include=REGEXP 
    正則表達式匹配表的名字[db.tb],直接傳遞給xtrabackup --tables選項。
  • --incremental 
    這個選項告訴xtrabackup創建一個增量備份,直接傳遞給xtrabakcup子進程,當這個選項指定,需要同時指定--incremental-lisn或者--incremental-basedir。如果沒有指定,默認傳給xtrabackup --incremental-basedir,值為Backup BASE目錄中的第一個時間戳目錄
  • --incremental-basedir=DIRECTORY 
    這個選項接受了一個字符串參數指定含有full backup的目錄為增量備份的base目錄,與--incremental同時使用
  • --incremental-dir=DIRECTORY 
    指定了增量備份的目錄,結合full backup生成生成一份新的full bakcup
  • --incremettal-history-name=NAME 
    這個選項指定了存儲在PERCONA_SCHEMA.xtrabackup_history基於增量備份的歷史記錄的名字。Percona Xtrabackup搜索歷史表查找最近(innodb_to_lsn)成功備份並且將to_lsn值作為增量備份啟動出事lsn.與innobackupex--incremental-history-uuid互斥。如果沒有檢測到有效的lsn,xtrabackup會返回error
  • --incremetal-history-uuid=UUID 
    這個選項指定了存儲在percona_schema.xtrabackup_history基於增量備份的特定歷史記錄的UUID
  • --incremental-lsn=LSN 
    這個選項指定增量備份的LSN,與--incremental選項一起使用
  • --kill-long-queries-timeout=SECONDS 
    這個選項指定innobackupex從開始執行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的這些查詢之間等待的秒數,默認值為0.以為著Innobakcupex不會kill任何查詢,使用這個選項xtrabackup需要有Process和super權限。
  • --kill-long-query-type=all|select 
    指定kill的類型,默認是all
  • --ftwrl-wait-timeout=SECONDS 
    執行FLUSH TABLES WITH READ LOCK之前,innobackupex等待阻塞查詢執行完成等待秒數,超時的時候如果查詢仍然沒有執行完,innobackupex會終止並報錯,默認為0,innobakcupex不等待查詢完成立刻FLUSH
  • --ftwrl-wait-threshold=SECONDS 
    指定innoabckupex檢測到長查詢和innobackupex --ftwrl-wait-timeount不為0,這個長查詢可以運行的閾值,
  • --ftwrl-wait-query-type=all|update 
    指定innobakcupex獲得全局鎖之前允許那種查詢完成,默認是ALL
  • --log-copy-interval=# 
    這個選項指定了每次拷貝log線程完成檢查之間的間隔(毫秒)
  • --move-back 
    從備份目錄中將最近一份備份中的所有文件移動到datadir目錄中
  • --no-lock 
    關閉FTWRL的表鎖,只有在你所有表都是Innodb表並且你不關心backup的binlog pos點
    如果有任何DDL語句正在執行或者非InnoDB正在更新時(包括mysql庫下的表) ,都不應該使用這個選項,後果是導致備份數據不一致
    如果考慮備份因為獲得鎖失敗,,可以考慮--safe-slave-backup立刻停止複制線程
  • --no-timestamp 
    這個選項阻止在BACKUP-ROOT-DIR裡創建一個時間戳子目錄,指定了該選項的話,備份在BACKUP-ROOT-DIR完成
  • --no-version-check 
    這個選項禁用由--version-check打開的version check
  • --parallel=NUMBER-OF-THREADS 
    指定xtrabackup並行複制的子進程數。注意是文件級別並行,如果有多個ibd文件,他們會並行拷貝,如果所有的表存在一個表空間文件中,沒有任何作用。直接傳遞給xtrabakcup --parallel選項
  • --password = PASSWORD
  • --port = PORT
  • --rebuild-indexes 
    與--apply-log一起用時候才有效。並且直接傳遞給xtrabackup,在apply log之後重建所有輔助索引,該選項用於Prepare緊湊備份。
  • --rebuild-threads=NUMBER-OF-THREADS 
    與--apply-log和--rebuild-index選項一起用時候才生效,重建索引的時候,xtrabacup以指定的線程數並行的處理表空間文件
  • --redo-only 
    這個選項在prepare base full backup,往其中merge增量備份(但不包括最後一個)時候使用。傳遞給xtrabackup --apply-log-only的選項。這個強制xtrabackup跳過rollback並且只重做redo
  • --rsync  
    通過rsync工具優化本地傳輸,當指定這個選項,innobackupex使用rsync拷貝非Innodb文件而替換cp,當有很多DB和表的時候會快很多。不能--stream一起使用
  • --safe-slave-backup 
    指定的時候innobackupex會在執行FLUSH TABLES WITH READ LOCK停止sql線程,並且直到show status裡slave_open_temp_tables的值為0的時候start backup,。如果沒有打開的臨時表,就開始備份,否則sql線程start或者stop直到沒有打開的臨時表,如果在innobackupex --safe-slave-backup-timeout之後slave_open_temp_tables的值仍沒有變成0備份就會失敗。SQL線程會在backup完成之後重啟。
  • --safe-slave-backup-timeout=SECONDS 
    innobackupex --safe-slave-backup應該等多少秒等slave_open_temp_tables變成0,默認是300秒
  • --scpopt=SCP-OPTIONS 
    當--remost-host指定的時候,指定傳給scp的命令行選項。如果沒有指定,默認為-Cp -c arcfour
  • --slave-info 
    對slave進行備份的時候使用,打印出master的名字和binlog pos,同樣將這些信息以change master的命令寫入xtrabackup_slave_info文件。可以通過基於這份備份啟動一個從庫並且保存在xtrabackup_slave_info文件中的binlog pos點創建一個新的從庫
  • --socket 
    連接本地實例的時候使用
  • --sshopt=SSH-OPTIONS 
    在指定了--remost-host的時候,指定傳給ssh的命令行選項
  • --stream=STREAMNAME 
    流式備份的格式,backup完成之後以指定格式到STDOUT,目前只支持tar和xbstream。使用xbstream為percona xtrabakcup髮型版本,如果在這個選項之後指定了路徑。會理解值為tmpdir
  • --tables-file=FILE 
    指定含有表列表的文件,格式為database.table,該選項直接傳給xtrabackup's --tables-file
  • --throttle=IOS 
    指定每秒IO操作的次數,直接傳遞給xtrabackup --throttle選項。只作用於bakcup階段有效。apply-log和--copy-back不生效不要一起用
  • --tmpdir=DIRECTORY 
    指定--stream的時候,指定臨時文件存在哪裡,在streaming和拷貝到遠程server之前,事務日誌首先存在臨時文件裡。
  • --use-memory=# 
    只能和--apply-log選項一起使用,prepare a backup的時候,xtrabackup做crash recovery分配的內存大小,單位字節。也可(1MB,1M,1G,1GB),直接傳給xtrabackup --use-memory選項
  • --version 
    顯示Innobackupex版本和版權信息後退出
  • --version-check 
    innobackupex在與server創建連接之後的備份階段進行版本檢查

沒有留言:

張貼留言