日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 备份_MySQL数据库备份实操

發布時間:2025/3/12 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 备份_MySQL数据库备份实操 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文基于mysql(8.0.20)及xtrabackup(8.0.13)最新版本,實現了完整的mysqldump邏輯備份、binlog增量備份、xtrabackup物理備份恢復,幫你快速掌握操作要點

主要內容:

  • 基礎環境搭建

  • mysqldump邏輯備份及恢復

    • 數據準備

    • 全量備份

    • 全量恢復

    • 其他備份

  • Xtrabackup物理備份及恢復

    • 程序安裝

    • 全量備份及恢復

    • 增量備份及恢復

  • binlog增量備份及恢復

  • 更多說明

    • mysql時區配置

    • 參考資料

基礎環境搭建

本文相關環境均基于docker實現,下面是啟動一個最基本的mysql數據庫:

docker?run?--name?mysql-dump-test?-p?3306:3306?-e?MYSQL_ROOT_PASSWORD=admin?-e?MYSQL_DATABASE=user?-d?mysql

mysqldump邏輯備份及恢復

在開展備份之前,需要先準備如下的測試數據:

數據準備

create?table?if?not?exists?t_user1
(
????id?????????bigint(20)?auto_increment?primary?key?comment?'主鍵',
????name???????varchar(64)?comment?'用戶名稱',
????birth_date?timestamp?comment?'生日',
????assert?????decimal(10,?2)?comment?'資產'
)?engine?=?InnoDB
??charset?utf8mb4?comment?'用戶表';

insert?into?t_user1(name,?birth_date,?assert)
values?('zhangsan',?now(),?1123000.99);

insert?into?t_user1(name,?birth_date,?assert)
values?('lisi',?now(),?1159000.99);

insert?into?t_user1(name,?birth_date,?assert)
values?('wangwu',?now(),?12341234.00);

如上,創建一張測試表,并插入3條測試數據。

全量備份

全量備份基本模式:

  • 進入到mysql容器中
  • 創建備份目錄
  • 通過mysqldump命令,執行數據庫邏輯備份操作,將結果輸出到 sql文件中。

主要命令如下:

#?級聯創建數據備份目錄
mkdir?-p?/data/backups/dmp
#?實現所有數據庫備份
mysqldump?--opt?--single-transaction?--master-data=2?--host=localhost?--user=root?--password=admin?--all-databases?>?/data/backups/dmp/dmp1.sql

mysqldump相關參數說明:

  • --opt 適用于備份大表,同時激活了-add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 命令
  • --single-transaction 開啟一個事務,并設置備份事務為可重復讀,保持備份數據一致性
  • --master-data=2 表示在備份過程中記錄主庫的binlog和pos點,并且在dump文件中注釋改行
  • --all-databases 導出所有數據庫,包括mysql庫

全量恢復

通過在上述庫中,執行drop table t_user1,刪除該表后,開展恢復:

  • 通過mysql命令,即可將 dump sql文件執行到對應的數據庫中。
mysql?-h?localhost?-u?root?-p?

其他備份

1、導出指定數據庫的指定表:

  • --databases 指定備份的數據庫
  • --tables 指定備份的具體數據庫表
mysqldump?--opt?--single-transaction?--master-data=2?--host=localhost?--user=root?-p?--databases?user?--tables?t_user1?>?/data/backups/dmp/dmp2.sql

2、只導出建表語句:

  • --no-data 申明不導出數據,只導出表結構
mysqldump?--host=localhost?--user=root?-p?--databases?user?--tables?t_user1?--no-data?>?/data/backups/dmp/dmp3.sql?

3、條件備份:

  • --where 來指定具體的查詢條件
  • --no-create-db 申明不導出數據庫創建等信息
  • --no-create-info 申明不導出創建表等信息,這樣就可以避免數據表被刪除
mysqldump?--single-transaction?--no-create-db?--no-create-info?--default-character-set=utf8?--host=localhost?--user=root?--password=admin?--databases?user?--tables?t_user1??--where="id?>=3"?>?/data/backups/dmp/dmp4.sql

Xtrabackup物理備份及恢復

當前xtrabackup的8.0.13已經支持 mysql 8.0.20版本(8.0.20版本對innodb的數據文件模式進行了修改)

程序安裝

與mysql環境一樣,需要將xtrabackup安裝到mysql容器中:

  • 在 https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ 中下載二進制包,例如當前docker-mysql容器是 debian的buster系統,則下載對應的文件percona-xtrabackup-80_8.0.13-1.buster_amd64.deb
  • 因為上述文件安裝會還會依賴其他庫,因此要將 /etc/apt/sources.list內容替換為國內鏡像,例如阿里云的。
  • 更多安裝說明,參考https://www.percona.com/doc/percona-xtrabackup/8.0/installation/apt_repo.html

原/etc/apt/sources.list文件內容如下:

#?deb?http://snapshot.debian.org/archive/debian/20200422T000000Z?buster?main
deb?http://deb.debian.org/debian?buster?main
#?deb?http://snapshot.debian.org/archive/debian-security/20200422T000000Z?buster/updates?main
deb?http://security.debian.org/debian-security?buster/updates?main
#?deb?http://snapshot.debian.org/archive/debian/20200422T000000Z?buster-updates?main
deb?http://deb.debian.org/debian?buster-updates?main

將內容全部替換為:

deb?http://mirrors.aliyun.com/debian/?buster?main?non-free?contrib
deb?http://mirrors.aliyun.com/debian-security?buster/updates?main
deb?http://mirrors.aliyun.com/debian/?buster-updates?main?non-free?contrib
deb?http://mirrors.aliyun.com/debian/?buster-backports?main?non-free?contribb

具體命令操作:

#?將容器中的文件拷貝出來
docker?cp?mysql-dump-test:/etc/apt/sources.list?D:\dev2\test\mysqldump
#?將修改后的文件覆蓋回容器中
docker?cp?D:\dev2\test\mysqldump\sources.list?mysql-dump-test:/etc/apt/
#?進入容器以后,執行下面命令更新apt信息
apt-get?update

完成上述準備工作以后,即可開始安裝xtrabackup:

  • 將下載好的文件percona-xtrabackup-80_8.0.13-1.buster_amd64.deb,拷貝到容器中
  • 通過dpkg來安裝,第一次執行會報錯,根據錯誤提示信息,發現最底部依賴libev4
  • 執行apt install libev4,此時依然會報錯,根據提示信息,執行apt --fix-broken install,此時會下載和安裝所有依賴包。
  • 上一步執行完成后,再次執行dpkg名稱,完成安裝

具體命令操作如下:

#?將下載文件拷貝到容器中
docker?cp?D:\dev2\test\mysqldump\percona-xtrabackup-80_8.0.13-1.buster_amd64.deb?mysql-dump-test:/data
#?執行第一次安裝,此時會出現錯誤提示
dpkg?-i?percona-xtrabackup-80_8.0.13-1.buster_amd64.deb
#?執行libev4?安裝,也會出錯
apt?install?libev4
#?執行相關依賴安裝
apt?--fix-broken?install
#?再次執行,完成安裝
dpkg?-i?percona-xtrabackup-80_8.0.13-1.buster_amd64.deb

全量備份及恢復

安裝成功后,即可測試全量備份:

  • 提前建立好 /data/backups/ 目錄
  • 通過查看用戶手冊,整個備份及恢復主要是三個過程:backup、prepa、copy-back

具體命令操作如下:

#?啟動全量備份
xtrabackup?--backup?--target-dir=/data/backups/base1?--user=root?--password=admin
#?通過執行drop?table?t_user1來模擬誤操作
#?準備全量恢復
xtrabackup?--prepare?--target-dir=/data/backups/base1
#?將備份文件同步到mysql數據文件目錄中
rsync?-avrP?/data/backups/base1/?/var/lib/mysql/
#?退出容器后,執行容器重啟,完成恢復
docker?restart?mysql-dump-test

同時,上述rsync也可以用如下命令替代,但需要保證datadir(也即/var/lib/mysql/)是空的:

xtrabackup?--copy-back?--target-dir=/data/backups/base1

增量備份及恢復

增量備份及恢復過程如下:

  • 先創建全量備份
  • 再在全量備份基礎上,執行增量備份
  • 恢復時,先執行全量路徑的prepare,再執行增量路徑的prepare

備份具體操作:

#?全量備份
xtrabackup?--backup?--target-dir=/data/backups/base2?--user=root?--password=admin

#?第一次增量備份
xtrabackup?--backup?--target-dir=/data/backups/inc1?--incremental-basedir=/data/backups/base2?--user=root?--password=admin

#?第二次增量備份
xtrabackup?--backup?--target-dir=/data/backups/inc2?--incremental-basedir=/data/backups/inc1?--user=root?--password=admin

恢復具體操作:

#?先恢復全量備份
xtrabackup?--prepare?--apply-log-only?--target-dir=/data/backups/base2
#?逐項恢復增量備份
xtrabackup?--prepare?--apply-log-only?--target-dir=/data/backups/base2?--incremental-dir=/data/backups/inc1
xtrabackup?--prepare?--apply-log-only?--target-dir=/data/backups/base2?--incremental-dir=/data/backups/inc2
#?將恢復文件進行同步
rsync?-avrP?/data/backups/base2/?/var/lib/mysql/
#?退出容器后,執行容器重啟,完成恢復
docker?restart?mysql-dump-test

binlog增量備份及恢復

binlog增量備份及恢復主要過程:

  • 在全量邏輯備份時,增加--flush-logs,目的是將緩存寫入到binlog,并開始一個新的binlog
  • 執行誤操作以后,通過定位到對應binlog文件位置,通過mysqlbinlog實現增量恢復

先執行全量備份:

#?執行全量備份
mysqldump?--opt?--single-transaction?--master-data=2?--flush-logs?--host=localhost?--user=root?--password=admin?--databases?user?>?/data/backups/dmp/dmp3.sql

下面是模擬誤操作(新增一條記錄后,刪除數據表):

insert?into?t_user1(name,?birth_date,?assert)
values?('maliu',?now(),?12341234.00);

drop?table?t_user1;

接下來是具體binlog定位及分析過程:

1、通過show variables like 'log_bin%'命令,查看binlog路徑,具體輸出如下:

Variable_name,Value
log_bin,ON
log_bin_basename,/var/lib/mysql/binlog
log_bin_index,/var/lib/mysql/binlog.index
log_bin_trust_function_creators,OFF
log_bin_use_v1_row_events,OFF

2、通過show master logs,查看當前binlog明細

Log_name,File_size,Encrypted
binlog.000001,3101453,No
binlog.000002,179,No
binlog.000003,3382334,No
binlog.000004,684,No

3、通過show master status查看最新binlog狀態

File,Position,Binlog_Do_DB,Binlog_Ignore_DB,Executed_Gtid_Set
binlog.000004,684,"","",""

4、將誤操作時binlog備份到執行目錄,然后通過全量備份恢復數據

#?備份binlog
mkdir?-p?/data/backups/binlog/
cp?/var/lib/mysql/binlog.000004?/data/backups/binlog/
#?先通過全量備份還原數據
mysql?-h?localhost?-u?root?-p?

5、分析binlog,確定具體誤操作位置

mysqlbinlog?--base64-output=DECODE-ROWS?/data/backups/binlog/binlog.000004?|?more

例如,通過上述命令,可查看binlog詳情(也可以通過show binlog events in 'binlog.000004'來分析),輸出如下:

#?at?552
#200719?14:48:19?server?id?1??end_log_pos?684?CRC32?0x2e00f1bb??Query???thread_id=8?????exec_time=0?????error_code=0????Xid?=?1534
use?`user`/*!*/;
SET?TIMESTAMP=1595170099/*!*/;
DROP?TABLE?`t_user1`?/*?generated?by?server?*/

分析后,即可定位到552位置即drop table的時刻

6、通過mysqlbinlog及定位到的位置,實現增量恢復

#?基于備份的binlog,將數據庫恢復到552位置
mysqlbinlog?--stop-position=552?/data/backups/binlog/binlog.000004?|?mysql?-u?root?-p

至此,binlog增量備份及恢復就完成了。

更多說明

mysql時區配置

補充一個配置,在mysql8中,默認的binlog_format是row,可通過show variables like “binlog_format”查看,因此就不需要單獨,但因為docker默認是標準時區,為了便于后續開發,還是需要配置為+8時區:

  • 將/etc/mysql/my.cnf文件拷貝出來
  • 增加default_time_zone='+8:00'相關配置
  • 將修改后的文件復制回去之后,重啟服務即可

修訂后的my.cnf文件:

[mysqld]
pid-file????????=?/var/run/mysqld/mysqld.pid
socket??????????=?/var/run/mysqld/mysqld.sock
datadir?????????=?/var/lib/mysql
secure-file-priv=?NULL
default_time_zone='+8:00'

主要操作命令:

#?將配置文件拷貝出來
docker?cp?mysql-dump-test:/etc/mysql/my.cnf?D:\dev2\test\mysqldump
#?將修改后的配置文件覆蓋回去
docker?cp?D:\dev2\test\mysqldump\my.cnf?mysql-dump-test:/etc/mysql
#?重啟mysql數據庫
docker?restart?mysql-dump-test
#?查看日志情況
docker?logs?mysql-dump-test

參考資料

歡迎關注我的公眾號【技術路漫漫】,反饋相關問題和意見:

更多參考資料:

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

https://www.percona.com/doc/percona-xtrabackup/8.0/index.html

總結

以上是生活随笔為你收集整理的mysql 备份_MySQL数据库备份实操的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。