「MySQL」- 复制数据库

注意,该处“复制”并非主动同步,而是指“在不依赖 Binlog 的情况下,从现有数据库实例中创建具有相同数据集的数据库实例”。

mysqldump + mysql

Cloning a MySQL database on the same MySql instance
halt – Continue SQL query even on errors in MySQL workbench – Stack Overflow
mysql – Any option for mysqldump to ignore databases for backup?

官方推荐做法,而实质还是数据的导出与导入:

# 将 src-db 复制到 dst-db 中
mysqldump -u "<user name>" --password="<pwd>" "<src-db>" | mysql -u "<user name>" -p "<dst-db>"

# 如果 dst-db 不存在
mysqldump -u "<user name>" --password="<pwd>" --databases "<src-db>" | mysql -u "<user name>" -p

# 仅复制表结构
# https://stackoverflow.com/questions/6175473/export-schema-without-data

mysqldump -u "<user name>" --password="<pwd>" --no-data "<src-db>" | mysql -u "<user name>" -p "<dst-db>"

# 忽略某些数据库

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done

mysql -f # –force Continue even if we get an sql error.

# 直接导入数据
database – How to import an SQL file using the command line in MySQL? – Stack Overflow
mysql -u username -p database_name < file.sql

mysqldump + mysql + pt-table-sync

sql – Export schema without data – Stack Overflow
MySQL :: MySQL 8.4 Reference Manual :: 9.4.5.2 Copy a Database from one Server to Another

针对 pt-table-sync 工具,其不会同步表结构,即会跳过不存在的表。所以,需要使用 mysqldump + mysql 来完成数据库结构的同步。

mysqldump -h host -u root -p --no-data "src-db" | mysql -u root -p "dst-db" # 如果数据库存在

# 如果 DB 不存在,则通过 --databases 使得导出语句中包含 CREATE DATABASE 与 USE 语句。
# 鉴于 --databases 选项,该命令同样适用于多个 DB 迁移。
mysqldump -h host -u root -p --no-data --databases "src-db" | mysql -u root -p 

pt-table-sync --execute \
    h=master1,P=3306,u=root,p=xxx,D=db,t=tbl \
    h=host2,P=3306,u=root,p=xxx,D=db,t=tbl

MySQL 8 Clone Plugin

MySQL 8.4 Reference Manual / … / The Clone Plugin

WIP

Percona XtraBackup

The MySQL Clone Wars: Plugin vs. Percona XtraBackup

WIP

mysqldbcopy(废弃)

Cloning a MySQL database on the same MySql instance

#!/bin/sh

apt-get install mysql-utilities

mysqldbcopy -vvv --drop-first \
    --source=root:your_password@localhost \
    --destination=root:your_password@localhost \
    sitedb1:sitedb2

附加说明,目前(03/14/2020)MySQL Utilities 已经暂停更新,只支持 Python 2 环境。但是对于 MySQL 8.0 以前的数据库完全可用。

GUI | Navicat

Navicat / Tools / Data Transfer…