TIDB-2.同步数据 mysql 到 tidb

准备工作

1.查看用户权限

show grants for {userName}

全量导出的 mydumper 需要的用户权限。
select, reload。

增量同步 Syncer 需要的上游 MySQL/MariaDB 用户权限。
select , replication slave , replication client

TIDB-2.同步数据 mysql 到 tidb_第1张图片

2.检查 SQL mode。

必须确认上下游的 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)

一. mydumper 全量同步

1. 检查mysql的库表是否可迁移tidb

./bin/checker -host 127.0.0.1 -port 3306 -user root {dbName} {tableName}

dbName:数据库名
tableName:表名,多个用 空格 分隔 (可省略)

2 删除旧数据

#删除 旧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.%’

3 mysql导出到文件

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

4. tidb中创建同步schema

CREATE SCHEMA `{dbName}` DEFAULT CHARACTER SET utf8

dbNmae:数据库名

5. 从文件导入tidb

这里使用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

6. other

–查看导入标记的 metadata 位于tidb 数据库中
(tidb中执行)

SELECT * FROM tidb_loader.checkpoint;

二. syncer 增量同步

1.查看数据库配置是否正确

-- 查看版本			(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';

备注:

  • 如果以上设置出现错误,则需要修改磁盘上的配置文件,然后重启 MySQL。
  • 将配置的更改持久化存储在磁盘上很重要,这样在 MySQL 重启之后才能显示相应更改。
  • 由于现有的连接会保留全局变量原先的值,所以不可以使用 SET 语句动态修改这些设置。

2.创建配置文件

2.1 metaData文件创建

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"

2.2 toml文件创建

示例: 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

3.启动syncer

./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

4.查看日志

tail -40 /usr/soft/tidbtools/log/{config}.log

三. tidb不支持的特性

视图、存储过程、触发器、自定义函数、外键约束、全文索引、空间索引、非UTF-8字符集。与我们实际应用不冲突。

你可能感兴趣的:(DB)