导入MySQL Binlog

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

您可以将自建MySQL数据库或RDS MySQL数据库中的Binlog导入到日志服务,实现数据的查询分析、加工等操作。本文介绍导入MySQL Binlog的操作步骤。

前提条件

  • 已创建MySQL数据库且开启ROW模式的Binlog功能。

    RDS MySQL数据库默认开启Binlog功能。

  • 已创建具备目标数据库读权限及MySQL REPLICATION权限的账号。

    例如数据库账号为sls_binlog,密码为sls_binlog。您需执行如下命令授予sls_binlog用户对目标数据库下的所有表有SELECT权限以及MySQL REPLICATION权限。

    CREATE USER sls_binlog IDENTIFIED BY 'sls_binlog';
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'sls_binlog'@'%';
    -- GRANT ALL PRIVILEGES ON *.* TO 'sls_binlog'@'%' ;
    FLUSH PRIVILEGES;
  • 在MySQL数据库中添加白名单。

    请根据数据导入任务所在Project的地域和数据库所在的网络环境,添加对应的IP地址白名单。IP地址列表请参见IP地址白名单

  • 已创建Project和Logstore。具体操作,请参见创建Project创建Logstore

导入数据

重要

目前,仅支持华南2(河源)地域。

  1. 登录日志服务控制台

  2. 在Project列表区域,单击目标Project。

  3. 日志存储 > 日志库页签中,单击目标Logstore左侧的>,然后将鼠标悬浮在数据接入 > 数据导入上,单击+

  4. 快速数据接入对话框,单击MySQL BinLog-数据导入

  5. 设置导入配置。

    1. 数据源设置中,配置如下参数。

      • 如果是专有网络下的RDS MySQL数据库,需选中使用VPC地址RDS实例,并设置如下参数。

        参数

        说明

        VPC实例ID

        RDS MySQL数据库所属VPC的ID。

        RDS实例ID

        需配置为RDS实例的VpcCloudInstanceId。您可以通过调用DescribeDBInstanceAttribute接口获取VpcCloudInstanceId。具体操作,请参见获取RDS实例的VpcCloudInstanceId

      • 如果是专有网络下ECS上自建的MySQL数据库,需选中使用VPC地址ECS自建数据库,并设置如下参数。

        参数

        说明

        VPC实例ID

        ECS实例所属VPC的ID。

        ECS实例IP

        ECS实例的私网IP地址。

      • 如果是公网环境下的RDS MySQL数据库或其他场景下自建的MySQL数据库,取消选中使用VPC地址,并设置如下参数。

        参数

        说明

        数据库公网IP或者域名

        MySQL数据库的公网IP地址或者域名。

      公共参数说明如下表所示。

      参数

      说明

      配置名称

      设置导入配置的名称。

      MySQL端口

      MySQL数据库的服务端口,默认为3306。

      用户名

      用于登录MySQL数据库的账号名称。

      建议只授予该账号读取MySQL数据的权限。

      密码

      账号密码。

      数据库

      MySQL数据库名称。

      高级配置

      数据库表白名单

      用于指定待采集的数据库表。正则表达式形式,格式为数据库名.表名,多个表之间使用半角分号(;)分隔。

      默认值为.*\..*,表示匹配所有数据库下的表。

      数据库表黑名单

      用于排除不需要采集的数据库表。正则表达式形式,格式为数据库名.表名,多个表之间使用半角分号(;)分隔。

      默认值为mysql\..*,表示排除名为mysql数据库下的所有表。

      binlog起始位置

      指定从哪个位置开始采集Binlog。

      • 最新位置:从最新位置开始采集Binlog。

      • 指定binlog位置:从指定的位置开始采集Binlog。

        您可以执行show binary logs;语句,查看Binlog文件名以及文件大小偏移量。

        如果不设置开始的binlog文件名开始的binlog位置,则从最新位置开始采集Binlog。

        说明

        如果只指定开始的binlog文件名,则第一次采集会产生较大流量。

      • 指定GTID:从指定的GTID位置,开始采集。

        如果不设置开始的GTID,则从最新位置开始采集Binlog。

      采集DDL

      打开采集DDL开关后,日志服务将采集DDL(data definition language)事件数据。

      重要

      该选项不受数据库表黑白名单限制。

      采集Insert

      打开采集Insert开关后,日志服务将采集Insert事件数据。

      采集Update

      打开采集Update开关后,日志服务将采集Update事件数据。

      采集Delete

      打开采集Delete开关后,日志服务将采集Delete事件数据。

      采集Event元数据

      打开采集Event元数据开关后,日志服务将采集Event元数据,包含_event_size__event_server_id_字段。

      使用event_time作为日志时间

      是否使用event_time字段的值作为日志时间。

      • 打开使用event_time作为日志时间开关,则使用event_time字段的值作为日志时间。

      • 关闭使用event_time作为日志时间开关,则使用系统时间作为日志时间。

    2. 单击预览,预览导入结果。

      说明

      如果RDS MySQL数据库未实时产生Binlog数据,系统将提示超时。

    3. 确认无误后,单击下一步

  6. 预览数据及创建索引,然后单击下一步
    日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引
    重要 如果您要查询和分析日志,那么全文索引和字段索引必须至少启用一种。同时启用时,以字段索引为准。
  7. 单击查询日志,进入查询和分析页面,确认是否成功导入MySQL Binlog。

    等待1分钟左右,如果有目标MySQL Binlog导入,则说明导入成功。

查看导入配置和统计报表

创建导入配置成功后,您可以在控制台中查看已创建的导入配置及生成的统计报表。

  1. 单击目标Project。

  2. 选择目标日志库下的数据接入 > 数据导入,单击目标导入配置。

  3. 导入配置概览页面,查看导入配置的基本信息和统计报表。

相关操作

导入配置概览页面,您还可以进行如下操作。

  • 修改配置

    单击修改配置,修改导入配置的相关配置,具体配置说明请参见导入数据

  • 删除配置

    单击删除配置,删除该导入配置。

    警告

    删除后不可恢复,请谨慎操作。

常见问题

  • 为什么会出现Binlog同步失效?

    主要原因如下:

    • 重启MySQL服务器或者清空Binlog导致Binlog位置丢失,需要重启导入任务获取Binlog的最新位置。

    • MySQL服务器主备切换导致Binlog不同步。例如最新的Binlog位置从(binlog.1005, 4)切换到(binlog.105, 4),丢失位置,需要重启导入任务获取Binlog的最新位置。

  • 为什么会出现unknown字段?

    主要原因如下:

    • 数据库账号没有数据库表的SELECT权限,导致表的元信息丢失。

    • 网络延迟很高,导致日志服务与MySQL服务器第一次连接时延迟很高,可能会出现表元信息丢失的情况。

    • RDS MySQL数据库表中没有建立主键。

  • 如何避免数据被重复采集?

    建议您启用MySQL服务器的全局事务ID(GTID)功能,避免因主备切换造成的数据重复采集。

    在MySQL主备同步的设置下,MySQL master节点会将产生的Binlog同步给MySQL slave节点,MySQL slave节点收到后存储到本地的Binlog文件中。当MySQL master节点和slave节点之间的Binlog序号不同步时,发生了主备切换事件,以Binlog文件名和文件大小偏移量作为checkpoint的机制将导致数据重复采集。

    例如有一段数据在MySQL master节点上位于(binlog.100, 4)到(binlog.105, 4)之间,而在MySQL slave节点上位于(binlog.1000, 4)到(binlog.1005, 4)之间,并且Logtail已经从MySQL master节点获取了这部分数据,将本地checkpoint更新到了(binlog.105, 4)。如果此时发生了主备切换,Logtail将会继续使用本地checkpoint(binlog.105, 4)去向新的MySQL master节点采集binlog。但是因为新的MySQL master上的(binlog.1000, 4)到(binlog.1005, 4)这部分数据的序号都大于Logtail所请求的序号,MySQL master将它们返回给Logtail,导致重复采集。