show grants for {userName}
全量导出的 mydumper 需要的用户权限。
select, reload。
增量同步 Syncer 需要的上游 MySQL/MariaDB 用户权限。
select , replication slave , replication client
必须确认上下游的 SQL mode 一致;如果不一致,则会出现数据同步的错误。
mysql> show variables like '%sql_mode%';
+---------------+-----------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------+
1 row in set (0.01 sec)
./bin/checker -host 127.0.0.1 -port 3306 -user root {dbName} {tableName}
dbName:数据库名
tableName:表名,多个用 空格 分隔 (可省略)
#删除 旧data数据
rm -rf /usr/soft/tidbtools/data/reg/*
#删除旧 syncer 数据
rm /usr/soft/tidbtools/meta/reg.meta (用于syncer同步?)
#清空导入记录 Tidb 执行 Sql
delete from tidb_loader.checkpoint where filename like ‘reg.%’
mydumper -h {hostIp} -P {port} -u {userName} -p '{PWD}' -t 16 -F 64 -B {dbName} -T {tableName} --skip-tz-utc -o {dir} --no-locks
hostIp: mysql数据库地址
prot:mysql端口
userName:数据库用户名
PWD:数据库密码
dbName: 库名 (可省略)
tableName: 表名,多表用 逗号 分隔 (可省略)
dir:目表文件夹位置
-m: 不备份表结构
-c:压缩
-C: --compress-protocol 在mysql连接的时候使用压缩协议
-t 16: 表明使用 16 个线程去导出数据。
-F 64:是将实际的 table 切分成多大的 chunk,这里就是 64MB 一个 chunk。
–skip-tz-utc 添加这个参数忽略掉 MySQL 与导数据的机器之间时区设置不一致的情况,禁止自动转换。
示例:
–no-locks:在阿里云等一些需要 super privilege 的云上面,mydumper 需要加上 --no-locks 参数,否则会提示没有权限操作。
-e, --build-empty-files 即使表没有数据,还是产生一个空文件
-x, 加正则表达式,如不同步event_entoty表,-x ‘^(?!(keycloak.event_entity))’
-v,–verbose更多输出,0=silent,1=errors,2=warnings,3=info,default2
mydumper -h 127.0.0.1 -P 3306 -u root -p 'xxxxxDB#' -t 16 -F 64 -B mysqldb -T tableA,tableB -c -C -m -o --skip-tz-utc /mnt/backup/ --no-locks
CREATE SCHEMA `{dbName}` DEFAULT CHARACTER SET utf8
dbNmae:数据库名
这里使用myloader,有些环境是使用loader的
还原库:
hostip: tidb数据库地址
myloader -h {hostip} -P 4000 -u {userName} -p '{PWD}' -t 32 -B {dbName} -d {dir}
还原表
myloader -h {hostip} -P 4000 -u {userName} -p '{PWD}' -B {dbName} -t 32 -o {tableName} -d {dir}
示例:
myloader -h 127.0.0.1 -P 4000 -u root -p 'xxxxxD#' -B mysqldb -o -t 32 tableA -d /mnt/backup/
-t 32:使用32个线程,tn *(1 ~ n) tn:tikv个数 n随机数 建议使用32或64
–查看导入标记的 metadata 位于tidb 数据库中
(tidb中执行)
SELECT * FROM tidb_loader.checkpoint;
-- 查看版本 (5.5 < MySQL 版本 < 5.8 , MariaDB 版本 >= 10.1.2)
select version();
-- 查看服务器ID (1.结果为空或者为 0,Syncer 无法同步数据; 2.Syncer server-id 与 MySQL server-id 不能相同,且必须在 MySQL cluster 中唯一。)
show GLOBAL VARIABLES like 'server-id';
-- 查看 是否开启binglog, 应为 ON (如果结果是 log_bin = OFF,则需要开启 binlog)
show GLOBAL VARIABLES like 'log_bin';
-- 查看binlog类型, 应为 ROW binlog 格式必须为 ROW
show GLOBAL VARIABLES like 'binlog_format';
备注:
vim /usr/soft/tidbtools/meta/syncer.meta
binlog-name = "mysql-bin.000003"
binlog-pos = 930143241
binlog-gtid = "2bfabd22-fff7-11e6-97f7-f02fa73bcb01:1-23,61ccbb5d-c82d-11e6-ac2e-487b6bd31bf7:1-4"
示例: config 一般使用库名
vim /usr/soft/tidbtools/conf/{config}.toml
log-level = "info"
log-file = "syncer.log"
log-rotate = "day"
server-id = 101
## meta 文件地址
meta = "./syncer.meta"
worker-count = 16
batch = 1000
flavor = "mysql"
## pprof 调试地址,Prometheus 也可以通过该地址拉取 Syncer metrics
status-addr = ":8271"
## 如果设置为 true,Syncer 遇到 DDL 语句时就会停止退出
stop-on-ddl = false
## 跳过 DDL 语句,格式为 **前缀完全匹配**,如:`DROP TABLE ABC` 至少需要填入 `DROP TABLE`
# skip-ddls = ["ALTER USER", "CREATE USER"]
## 在使用 route-rules 功能后,
## replicate-do-db & replicate-ignore-db 匹配合表之后 (target-schema & target-table) 数值
## 优先级关系: replicate-do-db --> replicate-do-table --> replicate-ignore-db --> replicate-ignore-table
## 指定要同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始
#replicate-do-db = ["~^b.*","s1"]
## 指定 **忽略** 同步数据库;支持正则匹配,表达式语句必须以 `~` 开始
#replicate-ignore-db = ["~^b.*","s1"]
# skip-dmls 支持跳过 DML binlog events,type 字段的值可为:'insert','update' 和 'delete'
# 跳过 foo.bar 表的所有 delete 语句
# [[skip-dmls]]
# db-name = "foo"
# tbl-name = "bar"
# type = "delete"
#
# 跳过所有表的 delete 语句
# [[skip-dmls]]
# type = "delete"
#
# 跳过 foo.* 表的 delete 语句
# [[skip-dmls]]
# db-name = "foo"
# type = "delete"
## 指定要同步的 db.table 表
## db-name 与 tbl-name 不支持 `db-name ="dbname,dbname2"` 格式
#[[replicate-do-table]]
#db-name ="dbname"
#tbl-name = "table-name"
#[[replicate-do-table]]
#db-name ="dbname1"
#tbl-name = "table-name1"
## 指定要同步的 db.table 表;支持正则匹配,表达式语句必须以 `~` 开始
#[[replicate-do-table]]
#db-name ="test"
#tbl-name = "~^a.*"
## 指定 **忽略** 同步数据库
## db-name & tbl-name 不支持 `db-name ="dbname,dbname2"` 语句格式
#[[replicate-ignore-table]]
#db-name = "your_db"
#tbl-name = "your_table"
## 指定要 **忽略** 同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始
#[[replicate-ignore-table]]
#db-name ="test"
#tbl-name = "~^a.*"
# sharding 同步规则,采用 wildcharacter
# 1. 星号字符 (*) 可以匹配零个或者多个字符,
# 例子, doc* 匹配 doc 和 document, 但是和 dodo 不匹配;
# 星号只能放在 pattern 结尾,并且一个 pattern 中只能有一个
# 2. 问号字符 (?) 匹配任一一个字符
#[[route-rules]]
#pattern-schema = "route_*"
#pattern-table = "abc_*"
#target-schema = "route"
#target-table = "abc"
#[[route-rules]]
#pattern-schema = "route_*"
#pattern-table = "xyz_*"
#target-schema = "route"
#target-table = "xyz"
[from]
host = "127.0.0.1"
user = "root"
password = ""
port = 3306
[to]
host = "127.0.0.1"
user = "root"
password = ""
port = 4000
./bin/syncer -config /usr/soft/tidbtools/conf/{config}.toml
错误解决Q&A:
1.Could not find first log file name in binary log index file
删除meta文件 再启动
rm /usr/soft/tidbtools/meta/{conf}.meta
tail -40 /usr/soft/tidbtools/log/{config}.log
视图、存储过程、触发器、自定义函数、外键约束、全文索引、空间索引、非UTF-8字符集。与我们实际应用不冲突。