[问题踩坑]Flink SQL CDC维表查询异常:User does not have the ‘LOCK TABLES‘ privilege required to obtain a ……

背景

使用Flink SQL CDC模式创建维表如下

CREATE TABLE cdc_test
(
    id  STRING,
    ip  STRING,
    url STRING,
    PRIMARY KEY (id) NOT ENFORCED
) WITH (
    'connector' = 'mysql-cdc',   -- Flink 1.11之后才支持
    'hostname' = '127.0.0.1',
    'port' = '3306',
    'database-name' = 'shadow-db',
    'table-name' = 'cdc',
    'username' = 'shadow',
    'password' = 'shadow@csdn'
);

查询该维表数据

SELECT * FROM cdc_test;

任务无法运行,抛出异常 User does not have the 'LOCK TABLES' privilege required to obtain a consistent snapshot by preventing concurrent writes to tables.

原因

连接MySQL的用户缺乏必要的CDC权限。

Flink SQL CDC基于Debezium实现。当启动MySQL CDC源时,它将获取一个全局读取锁(FLUSH TABLES WITH READ LOCK),该锁将阻止其他数据库的写入,然后读取当前binlog位置以及数据库和表的schema,之后将释放全局读取锁。然后它扫描数据库表并从先前记录的位置读取binlog,Flink将定期执行checkpoints以记录binlog位置。如果发生故障,作业将重新启动并从checkpoint完成的binlog位置恢复,因此它保证了仅一次的语义。

解决

创建一个新的MySQL用户并授予其必要的权限

mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;

参考

Flink CDC 原理及生产实践

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink SQL中的维表JOIN是指将流式数据与外部数据源中的维表进行关联查询,为实时计算提供数据关联。在维表JOIN时,需要指明这条记录关联维表快照的时刻。需要注意的是,目前Flink SQL维表JOIN仅支持对当前时刻维表快照的关联(处理时间语义),而不支持事实表rowtime所对应的维表快照(事件时间语义)。 下面是一个使用Flink SQL进行维表JOIN的例子: 假设我们有一个订单表order_table和一个商品表product_table,其中订单表中包含商品ID,我们需要将订单表中的商品ID关联到商品表中获取商品名称和价格等信息。这时我们可以使用维表JOIN来实现。 首先,我们需要在Flink SQL中创建订单表和商品表: ```sql CREATE TABLE order_table ( order_id BIGINT, product_id BIGINT, order_time TIMESTAMP(3), WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND ) WITH ( 'connector.type' = 'kafka', 'connector.version' = 'universal', 'connector.topic' = 'order_topic', 'connector.startup-mode' = 'latest-offset', 'connector.properties.zookeeper.connect' = 'localhost:2181', 'connector.properties.bootstrap.servers' = 'localhost:9092', 'format.type' = 'json' ); CREATE TABLE product_table ( product_id BIGINT, product_name STRING, price DECIMAL(10, 2), update_time TIMESTAMP(3), WATERMARK FOR update_time AS update_time - INTERVAL '5' SECOND ) WITH ( 'connector.type' = 'jdbc', 'connector.url' = 'jdbc:mysql://localhost:3306/test', 'connector.table' = 'product', 'connector.driver' = 'com.mysql.jdbc.Driver', 'connector.username' = 'root', 'connector.password' = '123456', 'connector.lookup.cache.max-rows' = '5000', 'connector.lookup.cache.ttl' = '10s' ); ``` 其中,order_table是从Kafka中读取的订单数据,product_table是从MySQL中读取的商品数据。 接下来,我们可以使用维表JOIN将订单表和商品表进行关联查询: ```sql SELECT o.order_id, o.product_id, p.product_name, p.price FROM order_table AS o JOIN product_table FOR SYSTEM_TIME AS OF o.order_time AS p ON o.product_id = p.product_id; ``` 在这个例子中,我们使用了FOR SYSTEM_TIME AS OF子句来指定关联维表的时刻为订单表中的订单时间。这样,我们就可以在Flink SQL中实现维表JOIN了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值