查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示,这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。

bin\pg_dump --dbname=postgresql://dbuser:123456@localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql
pg_dump: 错误: 查询失败: 閿欒:  瀵规ā寮?test 鏉冮檺涓嶅
pg_dump: 错误: 查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE

产生这个问题的原因是,pg_dump需要使用超级用户。

经过如下命令,更改dbuser为超级用户:

postgres=# alter user dbuser with superuser;
ALTER ROLE

接着,执行备份,不会报错。

### 创建 PostgreSQL 定时任务以执行锁定表、备份、清空和恢复数据的操作 以下是一个完整的解决方案,用于在 PostgreSQL 中创建一个定时任务,该任务将锁定 `zims.xxl_job_info` 表,创建备份表 `zims.xxl_job_info_bak0618`,清空原表,从备份表插入数据,并提交事务。 #### 1. 使用 `pg_cron` 扩展实现定时任务 首先,确保已安装并启用了 `pg_cron` 扩展。如果尚未安装,可以使用以下命令进行安装: ```sql CREATE EXTENSION IF NOT EXISTS pg_cron; ``` #### 2. 编写存储过程 创建一个存储过程来封装锁定表、备份、清空和恢复数据的操作。以下是存储过程的代码: ```sql CREATE OR REPLACE PROCEDURE zims.backup_and_restore() LANGUAGE plpgsql AS $$ DECLARE backup_table_name TEXT := 'zims.xxl_job_info_bak0618'; BEGIN -- 锁定原表以防止并发修改 LOCK TABLE zims.xxl_job_info IN ACCESS EXCLUSIVE MODE; -- 创建备份表(如果不存在) EXECUTE format('CREATE TABLE IF NOT EXISTS %I AS SELECT * FROM zims.xxl_job_info WITH NO DATA', backup_table_name); -- 备份数据到备份表 EXECUTE format('INSERT INTO %I SELECT * FROM zims.xxl_job_info', backup_table_name); -- 清空原表 TRUNCATE TABLE zims.xxl_job_info; -- 从备份表恢复数据(如果需要) EXECUTE format('INSERT INTO zims.xxl_job_info SELECT * FROM %I', backup_table_name); -- 提交事务 COMMIT; END; $$; ``` #### 3. 创建定时任务 使用 `cron.schedule` 函数创建定时任务,指定存储过程的执行时间和频率。例如,每天凌晨 2 点执行一次: ```sql SELECT cron.schedule('0 2 * * *', $$CALL zims.backup_and_restore()$$); ``` #### 4. 验证定时任务 可以通过查询 `cron.job` 表来验证定时任务是否已成功创建: ```sql SELECT * FROM cron.job; ``` #### 5. 删除定时任务(如果需要) 如果需要删除某个定时任务,可以使用以下命令: ```sql SELECT cron.unschedule(job_id); ``` 其中 `job_id` 是从 `cron.job` 表中获取的任务 ID。 --- ### 注意事项 - 在执行 `LOCK TABLE` 操作时,可能会导致其他会话在等待锁释放期间被阻塞[^1]。 - 如果备份表已经存在,`CREATE TABLE` 语句将不会重新创建表,但会插入新数据[^2]。 - 确保 `pg_cron` 扩展已正确配置并运行,否则定时任务可能无法生效[^3]。 --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值