flinkCdc的mysql配置及java测试代码

测试使用的是flinkCdc2.1.1版本(无锁同步,1.x版本有同步锁)目前支持mysql5.7及以上版本;

要在mysql.cnf中配置开启开启mysql的bin-log日志,


  
  
  1. log_bin =mysql-bin
  2. binlog_ format =ROW

并且只支持ROW格式,其他mixed和statement会报错 如果想配置控制binlog日志的范围,在数据库范围可以使用mysql的binlog-do-db和binlog-ignore-db,表级别可以使用replicate_wild_do_table, 不过不建议配置,因为在一些特殊情况下有可能造成同步的数据不完整,参考mysql中replicate_wild_do_table和replicate_do_db区别 - mofy - 博客园

如果不配置binlog-do-db相当于所有的库都可以同步, 一旦配置了binlog-do-db则除了配置了binlog-do-db的库能同步binlog日志,其他的库都不能同步了。

修改mysql.cnf之后要重启数据库生效,重启之后可以查询binlog日志是否已经开启以及格式等信息;


  
  
  1. -- 创建mysql用户
  2. CREATE USER 'cdc'@ '%' IDENTIFIED BY 'cdc';
  3. -- 赋权
  4. GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *. * TO 'cdc'@ '%';
  5. -- # 是否启用binlog日志
  6. show variables like 'log_bin';
  7. -- # 查看 binlog 内容
  8. show binlog events;
  9. /*# 事件查询命令
  10. # IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
  11. # FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
  12. # LIMIT [offset,] :偏移量(不指定就是0)
  13. # row_count :查询总条数(不指定就是所有行) */
  14. show binlog events [ IN 'log_name'] [ FROM pos] [LIMIT [ offset,] row_count];
  15. -- # 设置binlog文件保存事件,过期删除,单位天
  16. set global expire_logs_days = 31;
  17. # mysqlbinlog查看binlog
  18. mysqlbinlog --no-defaults --database=etl_test_1210 --base64-output=decode-rows -v --start-datetime='2021-12-03 09:00:00' --stop-datetime='2021-12-03 10:27:00' mysql-bin.000101

另外注意flinkcdc使用的mysql用户要有reload权限,否则读取不到存量数据,只能获取增量。

GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cdc' IDENTIFIED BY 'cdc';

java代码


  
  
  1. import com.ververica.cdc.connectors.mysql.source.MySqlSource;
  2. import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
  3. import org.apache.flink.api.common.eventtime.WatermarkStrategy;
  4. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  5. public class MySqlCdcPrint {
  6. public static void main (String[] args) throws Exception {
  7. MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
  8. .hostname( "127.0.0.1")
  9. .port( 3307)
  10. .databaseList( "cdc_test") // monitor all tables under inventory database
  11. .tableList( "cdc_test.test1") // set captured table
  12. .username( "root")
  13. .password( "123456")
  14. .deserializer( new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
  15. .build();
  16. StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  17. // enable checkpoint
  18. env.enableCheckpointing( 60000); //checkpoint需要什么条件?com/ververica/cdc/connectors/mysql/source/enumerator/MySqlSourceEnumerator.snapshotState()
  19. env
  20. .fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source")
  21. // set 4 parallel source tasks
  22. .setParallelism( 1)
  23. .print( "最终数据===>").setParallelism( 1); // use parallelism 1 for sink to keep message ordering
  24. env.execute( "MySqlCdcPrint");
  25. }
  26. }

打印了表中的数据,并且新增insert数据后也会打印出来

flinkCdc的mysql配置及java测试代码_shy_snow的专栏-优快云博客

pom.xml


  
  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>org.example </groupId>
  7. <artifactId>flinkCdc </artifactId>
  8. <version>1.0-SNAPSHOT </version>
  9. <properties>
  10. <flink.version>1.13.5 </flink.version>
  11. <debezium.version>1.5.4.Final </debezium.version>
  12. <geometry.version>2.2.0 </geometry.version>
  13. <java.version>8 </java.version>
  14. <scala.binary.version>2.12 </scala.binary.version>
  15. <maven.compiler.source>${java.version} </maven.compiler.source>
  16. <maven.compiler.target>${java.version} </maven.compiler.target>
  17. <slf4j.version>1.7.25 </slf4j.version>
  18. <log4j.version>2.16.0 </log4j.version>
  19. <spotless.version>2.4.2 </spotless.version>
  20. <!-- Enforce single fork execution due to heavy mini cluster use in the tests -->
  21. <flink.forkCount>1 </flink.forkCount>
  22. <flink.reuseForks>true </flink.reuseForks>
  23. <log4j.configuration>log4j2-test.properties </log4j.configuration>
  24. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  25. </properties>
  26. <dependencies>
  27. <dependency>
  28. <groupId>com.ververica </groupId>
  29. <!-- add the dependency matching your database -->
  30. <artifactId>flink-connector-mysql-cdc </artifactId>
  31. <!-- the dependency is available only for stable releases. -->
  32. <version>2.1.1 </version>
  33. </dependency>
  34. <dependency>
  35. <groupId>junit </groupId>
  36. <artifactId>junit </artifactId>
  37. <version>4.11 </version>
  38. <scope>test </scope>
  39. </dependency>
  40. <dependency>
  41. <groupId>com.alibaba </groupId>
  42. <artifactId>fastjson </artifactId>
  43. <version>1.2.75 </version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.apache.flink </groupId>
  47. <artifactId>flink-streaming-java_${scala.binary.version} </artifactId>
  48. <version>${flink.version} </version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.apache.flink </groupId>
  52. <artifactId>flink-clients_${scala.binary.version} </artifactId>
  53. <version>${flink.version} </version>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.apache.flink </groupId>
  57. <artifactId>flink-java </artifactId>
  58. <version>${flink.version} </version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.apache.flink </groupId>
  62. <artifactId>flink-table-planner-blink_${scala.binary.version} </artifactId>
  63. <version>${flink.version} </version>
  64. <type>test-jar </type>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.slf4j </groupId>
  68. <artifactId>slf4j-simple </artifactId>
  69. <version>${slf4j.version} </version>
  70. <scope>compile </scope>
  71. </dependency>
  72. </dependencies>
  73. </project>

### Flink CDC 采集 TiDB 数据时出现乱码的解决方案 当遇到 Flink CDC 采集 TiDB 数据过程中出现乱码的情况,通常是因为字符编码设置不一致所引起的。为了确保数据能够被正确读取和处理,需要确认几个关键配置项。 #### 确认数据库端字符集设置 首先应当检查 TiDB 实例中的默认字符集以及表级别的字符集定义是否统一。可以通过执行 SQL 查询来获取当前会话或全局范围内的字符集参数: ```sql SHOW VARIABLES LIKE 'character_set%'; ``` 这一步骤有助于了解是否存在不同组件间字符集差异的问题[^1]。 #### 配置 Flink 应用程序字符编码选项 接着,在构建 Flink 流应用程序时,需指定正确的输入/输出流编码方式。对于使用 `Debezium` 或其他基于 JSON 格式的变更事件捕获机制来说,默认情况下它们是以 UTF-8 编码传输消息体内容给下游系统的。因此建议显式声明连接属性以匹配源端的数据表示形式: ```java Properties props = new Properties(); props.setProperty("database.server.name", "mydb"); // 设置合适的字符集名称 props.setProperty("database.history.kafka.topic.auto.create", "true"); props.setProperty("key.converter.schemas.enable", "false"); props.setProperty("value.converter.schemas.enable", "false"); String url = String.format("jdbc:mysql://%s:%d/?useUnicode=true&characterEncoding=UTF-8", hostname, port); JdbcSource<T> source = JdbcSource.<T>builder() .setDriverName(driverClassName) .setDbUrl(url) .setTableName(tableName) .build(); ``` 上述代码片段展示了如何通过 JDBC URL 参数的方式强制指定了 Unicode 及其具体编码格式为 UTF-8 来避免潜在的乱码现象发生[^2]。 #### 调整 Debezium Connector 属性 如果采用的是官方提供的 TiDB CDC 连接器,则可以尝试调整如下所示的相关配置项,从而更好地控制序列化过程并减少因编码问题引发的数据损坏风险: ```yaml name: my-tidb-cdc-connector config: connector.class: io.debezium.connector.tidb.TiDBConnector database.hostname: localhost database.port: 4000 database.user: root database.password: password # 明确指出要使用的字符集 database.dbname: test_db table.include.list: test_table key.converter: org.apache.kafka.connect.json.JsonConverter value.converter: org.apache.kafka.connect.json.JsonConverter key.converter.schemas.enable: false value.converter.schemas.enable: false include.schema.changes: true decimal.handling.mode: string time.precision.mode: connect character.encoding: utf8mb4 ``` 这里特别注意设置了 `character.encoding=utf8mb4` ,这是为了让 Kafka Connect 插件能够在内部操作期间维持与上游 TiDB 表结构相吻合的文字表达能力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值