CloudSQL迁移报错:无权限设置log_min_duration_statement参数
问题描述
使用Database Migration Service将现有数据库迁移至Cloud SQL时,启动迁移后收到以下错误:
finished setup replication with errors: [api_production]: error importing schema: failed to restore schema: stderr=pg_restore: while PROCESSING TOC: pg_restore: from TOC entry 3997; 0 0 DATABASE PROPERTIES api_production postgres pg_restore: error: could not execute query: ERROR: permission denied to set parameter "log_min_duration_statement" Command was: ALTER DATABASE api_production SET log_min_duration_statement TO '500ms'; pg_restore: warning: errors ignored on restore: 1 , stdout=
错误原因是Cloud SQL的默认用户无权限执行ALTER DATABASE ... SET语句修改数据库级参数,导致pg_restore报错。
解决方案
方法一:在DMS中添加pg_restore跳过参数
在DMS的迁移任务配置里,找到高级选项(或自定义pg_restore参数的入口),添加以下两个参数到额外命令行选项中:
--no-settings --no-security-labels
--no-settings:跳过所有数据库配置参数的恢复语句,包含ALTER DATABASE SET这类命令--no-security-labels:跳过权限、安全标签相关语句,避免其他权限类报错
方法二:预处理备份文件(适用于自行生成的备份)
如果是你自己导出的数据库备份文件,先清理引发错误的语句再迁移:
- 生成备份文件的TOC(表内容目录)列表:
pg_restore --list your_backup.dump > toc_list.txt
- 编辑
toc_list.txt,找到对应DATABASE PROPERTIES api_production的条目(比如报错里的TOC entry 3997),删除该行 - 用清理后的TOC列表重新生成备份文件:
pg_restore --use-list toc_list.txt your_backup.dump -Fc > cleaned_backup.dump
- 使用
cleaned_backup.dump作为迁移源文件重新启动迁移
方法三:忽略错误后手动补设参数
由于pg_restore已提示"errors ignored on restore: 1",迁移大概率能继续完成,仅该参数未设置。迁移完成后手动设置参数即可:
- Cloud SQL控制台:进入目标实例的「数据库」页面,选择
api_production数据库,在数据库参数中设置log_min_duration_statement为500ms - gcloud命令行:
gcloud sql databases patch api_production --instance=你的实例名称 --database-flags=log_min_duration_statement=500ms
内容的提问来源于stack exchange,提问作者Hayden Ball

