背景

由於公司所有開發測試數據庫都是存在一個mysql實例的,後面有些數據庫有很多表幾萬表,太影響性能了,就想着把這些庫拆開到單獨的實例,使用xtrabackup可以在線備份並且有記錄binlog位置,使用xtrabackup將這幾個庫單獨備份出來,再恢復,但是xtrabackupl默認是全庫備份 的,指定 單獨的庫備份 後mysql會提示其他庫的表空間不存在,以下記錄操作過程:

使用xtrabackup備份mysql庫和指定的庫

xtrabackup  --user=root --password=xxx --port=23306 --host=x.x.x.x --backup --databases-file="/tmp/default_datacenter.file" --datadir=/deploy/mysql_8.0/data/mysql --target-dir=/backup/20251118

其中需要的庫名寫在/tmp/default_datacenter.file

將備份的目錄上傳到目的服務器

scp -r /backup/20251118/* 10.10.10.126:/backup/20251118

在目的服務器進行恢復

xtrabackup --prepare  --target-dir=/backup/20251118
xtrabackup --datadir=/deploy/sorts/mysql/data/mysql --copy-back --target-dir=/backup/20251118

啓動目的數據庫

啓動前需要先修改權限 chown -R polkitd:input data log 因為我Mysql是容器的,映射出來的用户和組就這個 然後啓動Mysql 啓動時會跑一段時間的warn提示你表空間不存在,這是正常的,因為備份的時候是備份mysql庫和指定的庫,mysql庫裏面有全部庫的信息,他啓動的時候就會檢查這些信息。

解決表空間不存在的問題

drop database 不存在的庫名
DELETE FROM innodb_table_stats WHERE database_name = '不存在的庫名';

當執行上面操作時會提示本地沒有這個目錄,需要先在mysql存儲目錄先建這幾個“不存在的庫名”目錄,然後再執行上面操作

開始做主從

修改從庫的my.cnf文件,指定只需要複製的數據庫

replicate-do-db = default_datacenter_drp
replicate-do-db = default_datacenter_fi
replicate-do-db = default_datacenter_hr
replicate-do-db = default_datacenter_meta
replicate-do-db = default_datacenter_scm
replicate-do-db = default_datacenter_secd
replicate-do-db = default_datacenter_sys
replicate-do-db = default_datacenter_zjbak_drp
replicate-do-db = default_datacenter_zjbak_fi
replicate-do-db = default_datacenter_zjbak_hr
replicate-do-db = default_datacenter_zjbak_meta
replicate-do-db = default_datacenter_zjbak_scm
replicate-do-db = default_datacenter_zjbak_secd
replicate-do-db = default_datacenter_zjbak_sys
replicate-do-db = default_datacenter_zjdev_drp
replicate-do-db = default_datacenter_zjdev_fi
replicate-do-db = default_datacenter_zjdev_hr
replicate-do-db = default_datacenter_zjdev_meta
replicate-do-db = default_datacenter_zjdev_scm
replicate-do-db = default_datacenter_zjdev_secd
replicate-do-db = default_datacenter_zjdev_sys

查看binlog位置

cat /backup/20251118/xtrabackup_binlog_info 
binlog.008943	156

執行建立主從命令

CHANGE MASTER TO MASTER_HOST='x.x.x.x',MASTER_PORT=23306,MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='binlog.008943',MASTER_LOG_POS=156;

然後start slave; 再查看show slave status \G; image.png