使用Liquibase部署BigQuery Schema时遭遇400错误求助
错误详情
SEVERE [liquibase.integration] [Simba]BigQueryJDBCDriver Error executing query job. Message: Syntax error: Missing whitespace between literal and alias at [1:35] [Failed SQL: (100032) CREATE TABLE projectId.databasename.DATABASECHANGELOG (ID STRING(255), AUTHOR STRING(255), FILENAME STRING(255), DATEEXECUTED datetime, ORDEREXECUTED INT, EXECTYPE STRING(10), MD5SUM STRING(35), DESCRIPTION STRING(255), COMMENTS STRING(255), TAG STRING(255), LIQUIBASE STRING(20), CONTEXTS STRING(255), LABELS STRING(255), DEPLOYMENT_ID STRING(10))]
已知信息
- 未手动修改过
databasechangelog或databasechangeloglock表,报错语句是Liquibase自动生成的内部命令 - 运行环境:已配置服务账号权限的Kubernetes集群
- 已尝试将JDBC URL中的
DefaultDataset从projectId.databasename改为databasename,问题未解决
当前配置
JDBC URL
url: jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=projectId;DefaultDataset=projectId.databasename;OAuthType=3;
执行的Liquibase命令
liquibase update --changelog-file=/changelog/changeSetFile.sql --url=jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=projectId;DefaultDataset=projectId.databasename;OAuthType=3; --log-level=INFO
解决方案
1. 指定BigQuery方言执行命令
Liquibase默认可能未正确识别BigQuery语法,执行命令时添加--dialect=bigquery参数,强制使用BigQuery方言生成符合要求的SQL:
liquibase update --changelog-file=/changelog/changeSetFile.sql --url=jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=projectId;DefaultDataset=databasename;OAuthType=3; --dialect=bigquery --log-level=INFO
2. 修正JDBC URL的DefaultDataset配置
确保DefaultDataset仅填写数据集名称(无需带上ProjectId),因为URL中已经通过ProjectId指定了项目,正确的URL格式:
jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=projectId;DefaultDataset=databasename;OAuthType=3;
3. 升级Liquibase或BigQuery JDBC驱动版本
旧版本的Liquibase对BigQuery的支持存在语法生成bug(比如将DATETIME类型写为小写datetime),或者JDBC驱动存在解析问题,尝试升级到最新版的Liquibase(推荐4.19+)和Simba BigQuery JDBC驱动。
4. 手动指定变更日志表名(可选)
在liquibase.properties文件中显式指定变更日志表名,避免自动生成时的格式问题:
liquibase.databaseChangeLogTableName=DATABASECHANGELOG liquibase.databaseChangeLogLockTableName=DATABASECHANGELOGLOCK
内容的提问来源于stack exchange,提问作者Shubham Avasthi

