美文网首页
Syncer使用(MySQL向TiDB[MySQL]同步数据)

Syncer使用(MySQL向TiDB[MySQL]同步数据)

作者: 什锦小沐 | 来源:发表于2022-06-04 21:41 被阅读0次

    本文档主要从https://www.pingcap.com/docs-cn/tools/syncer/整理。

    一、Syncer 简介

    Syncer 是一个数据导入工具,能方便地将 MySQL 的数据增量导入到 TiDB。

    二、Syncer 架构

    Syncer 架构

    三、部署Syncer

    下载 TiDB 企业版工具集 (Linux)。Syncer可以部署在任一台可以连通对应MySQL和TiDB集群的机器上,推荐部署在TiDB集群。

    下载 tool 压缩包和压缩包的sha256码(用于检测文件完整性)

    wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz

    wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256

    成功 时如下图:

    下载成功时输出

    检查文件完整性,返回 OK 则正确

    sha256sum -c tidb-enterprise-tools-latest-linux-amd64.sha256

    返回OK时输出:

    检查文件完整性

    解开压缩包

    tar -xzf tidb-enterprise-tools-latest-linux-amd64.tar.gz

    四、Syncer同步前检查

    4.1源库 server-id 检查

    可通过以下命令查看 server-id,结果为空或者为 0,Syncer 无法同步数据

    Syncer server-id 与 MySQL server-id 不能相同,且在 MySQL cluster 中唯一

    show global variables like 'server_id';

    我的MySQL输出如下:

    源库 server-id

    4.2检查 Binlog 相关参数

    检查 MySQL 是否开启 binlog

    可以用如下命令确认是否开启了 binlog

    如果结果是 log_bin = OFF,需要开启。开启方式请参考 官方文档

    show global variables like 'log_bin';

    我的MySQL输出如下:

    这个一般都会开启的

    4.3检查 MySQL binlog 格式是否为 ROW

    可以用如下命令检查 binlog 格式:

    show global variables like 'binlog_format';

    我的MySQL输出如下:

     binlog 格式

    如果发现 binlog 格式是其他格式,可以通过如下命令设置为 ROW(未测试):

    如果 MySQL 有连接,建议重启 MySQL 服务或者杀掉所有连接。

    set global binlog_format=ROW;

    flush logs;

    4.4检查 MySQL binlog_row_image 是否为 FULL

    可以用如下命令检查 binlog_row_image

    show global variables like 'binlog_row_image';

    我的MySQL输出如下:

    binlog_row_image 是否为 FULL

    如果 binlog_row_image 结果不为 FULL,请设置为 FULL。设置方式如下(未测试):

    set global binlog_row_image = FULL;

    4.5检查 mydumper 用户权限

    mydumper 导出数据至少拥有以下权限: select, reload

    mydumper 操作对象为 RDS 时,可以添加 --no-locks 参数,避免申请 reload 权限

    4.6检查上下游同步用户权限

    需要上游 MySQL 同步账号至少赋予以下权限:select , replication slave , replication client

    下游 TiDB 可暂时采用 root 同权限账号

    4.7检查 GTID 与 POS 相关信息

    查看所有binlog日志

    show binary logs;

    我的MySQL输出如下:

    所有binlog日志

    使用以下语句查看 binlog 内容:

    show binlog events in 'mysql-bin.000037' from 0 limit 10;

    五、Syncer同步 

    在解压的tidb-enterprise-tools-latest-linux-amd64目录中看到只有bin目录,这里我们新建conf目录

    mkdir conf

    5.1准备配置文件syncer.meta

    创建syncer.meta文件,存放binlog position

    vi syncer.meta

    在文件中加入同步开始的binlog名称及postion:

    binlog-name = "mysql-bin.000037"

    binlog-pos = 0

    ps:syncer.meta 只需要第一次使用的时候配置,后续 Syncer 同步新的 binlog 之后会自动将其更新到最新的 position。

    5.1准备配置文件config.toml

    vi config.toml

    在文件中加入如下内容:

    log-level = "info"

    server-id = 20113306

    ## meta 文件地址

    meta = "./syncer.meta"

    worker-count = 16

    batch = 10

    ## pprof 调试地址, Prometheus 也可以通过该地址拉取 syncer metrics

    ## 将 127.0.0.1 修改为相应主机 IP 地址

    status-addr = "127.0.0.1:10086"

    # 注意: skip-sqls 已经废弃, 请使用 skip-ddls.

    # skip-ddls 可以跳过与 TiDB 不兼容的 DDL 语句,支持正则语法。

    # skip-ddls = ["^CREATE\\s+USER"]

    # 注意: skip-events 已经废弃, 请使用 skip-dmls

    # skip-dmls 用于跳过 DML 语句. 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"

    ## 指定要同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始

    #replicate-do-db = ["~^b.*","s1"]

    ## 指定要同步的 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.*"

    ## 指定**忽略**同步数据库;支持正则匹配,表达式语句必须以 `~` 开始

    #replicate-ignore-db = ["~^b.*","s1"]

    ## 指定**忽略**同步数据库

    ## 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

    其中server-id就是源数据库的server-id(20113306)

    相关文章

      网友评论

          本文标题:Syncer使用(MySQL向TiDB[MySQL]同步数据)

          本文链接:https://www.haomeiwen.com/subject/aubvtqtx.html