将 SymmetricDS 与 Azure SQL 数据库一起使用时的权限问题

Posted

技术标签:

【中文标题】将 SymmetricDS 与 Azure SQL 数据库一起使用时的权限问题【英文标题】:Permission issue when using SymmetricDS with Azure SQL Database 【发布时间】:2018-06-05 05:17:41 【问题描述】:

我有两个引擎:postgres.properties(主节点)和 azure.properties。两者都在同一台机器上。一个数据库在本地,一个在云端。

当 SymmetricDS 启动时,它给了我这个 Azure 引擎的错误:

2018-06-05 06:49:30,476 WARN [azure] [JdbcSqlTemplate] [symmetric-engine-startup-1] CREATE TABLE permission denied in database 'master'..  Failed to execute: CREATE TABLE "sym_channel"(
    "channel_id" VARCHAR(128) NOT NULL,
    "processing_order" INT DEFAULT 1 NOT NULL,
    "max_batch_size" INT DEFAULT 1000 NOT NULL,
    "max_batch_to_send" INT DEFAULT 60 NOT NULL,
    "max_data_to_route" INT DEFAULT 100000 NOT NULL,
    "extract_period_millis" INT DEFAULT 0 NOT NULL,
    "enabled" SMALLINT DEFAULT 1 NOT NULL,
    "use_old_data_to_route" SMALLINT DEFAULT 1 NOT NULL,
    "use_row_data_to_route" SMALLINT DEFAULT 1 NOT NULL,
    "use_pk_data_to_route" SMALLINT DEFAULT 1 NOT NULL,
    "reload_flag" SMALLINT DEFAULT 0 NOT NULL,
    "file_sync_flag" SMALLINT DEFAULT 0 NOT NULL,
    "contains_big_lob" SMALLINT DEFAULT 0 NOT NULL,
    "batch_algorithm" VARCHAR(50) DEFAULT 'default' NOT NULL,
    "data_loader_type" VARCHAR(50) DEFAULT 'default' NOT NULL,
    "description" VARCHAR(255),
    "queue" VARCHAR(25) DEFAULT 'default' NOT NULL,
    "max_network_kbps" DECIMAL(10,3) DEFAULT 0.000 NOT NULL,
    "data_event_action" CHAR(1),
    "create_time" DATETIME,
    "last_update_by" VARCHAR(50),
    "last_update_time" DATETIME,
    PRIMARY KEY ("channel_id")
)

这是因为“主”数据库是read-only in Azure SQL databases。之后,[azure] 节点立即关闭。

INFO [azure] [AbstractSymmetricEngine] [symmetric-engine-startup-1] 停止 SymmetricDS externalId=001 version=3.9.7 database=Microsoft SQL Server

.. 然后 [postgres] 节点对此有话要说:

警告 [postgres] [PushService] [postgres-push-default-3] 无法推送到组“azure”中的节点“001”。同步网址为空

两个引擎都设置了同步 url 和注册 url,所以我认为真正的问题是权限问题。

问题:

如何解决此错误? 我假设我需要指示 SymmetricDS 使用“master”以外的数据库,但如何?

postgres.properties

engine.name=postgres
db.driver=org.postgresql.Driver

# The JDBC URL used to connect to the database
db.url=jdbc:postgresql://127.0.0.1/<redacted>

# The user to login as who can create and update tables
db.user=<redacted>

# The password for the user to login as
db.password=<redacted>

registration.url=
sync.url=http://localhost:31415/sync/postgres-000

# Do not change these for running the demo
group.id=postgres
external.id=000

# Don't muddy the waters with purge logging
job.purge.period.time.ms=7200000

# This is how often the routing job will be run in milliseconds
job.routing.period.time.ms=5000
# This is how often the push job will be run.
job.push.period.time.ms=10000
# This is how often the pull job will be run.
job.pull.period.time.ms=10000
# Kick off initial load
initial.load.create.first=true

azure.properties

engine.name=azure
db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver # located in the libs folder

# The JDBC URL used to connect to the database
db.url=jdbc:jtds:sqlserver://<redacted>

# The user to login as who can create and update tables
db.user=<redacted>

# The password for the user to login as
db.password=<redacted>

sync.url=http://localhost:31415/sync/azure-001
registration.url=http://localhost:31415/sync/postgres-000

group.id=azure
external.id=001

# This is how often the routing job will be run in milliseconds
job.routing.period.time.ms=5000
# This is how often the push job will be run.
job.push.period.time.ms=10000
# This is how often the pull job will be run.
job.pull.period.time.ms=10000

【问题讨论】:

【参考方案1】:

在文件azure.properties 中带有sync.url 的行被注释掉:

# sync.url=http://localhost:31415/sync/azure-001

经验法则是 symmetricDs 代理应尽可能靠近它同步的数据库。应该有一个对称 ds 代理在主节点附近运行,另一个在云中靠近天蓝色实例。您将无法同步只读数据库。 SymmetricDs 需要写入/读取,甚至创建表、函数、包和触发器权限才能正常工作

【讨论】:

1.此对称 ds 实例在与 SQL Server 数据库位于同一数据中心的 Azure VM 中运行。 PostgreSQL 数据库也在同一个虚拟机上运行。一切都“尽可能接近”。 2. 我取消了该行的注释(请参阅更新后的帖子),但它仍然告诉我同步 url 是空白的,即使我停止并重新启动 symmetricDS 3. 目标不是同步只读数据库。似乎 SymmetricDS 正在尝试在只读的“master”中创建所有“sym_trigger”、“sym_node”、“sym_router”等表。我假设我需要做的是让它在其他地方创建这些表。 您可以在另一个数据库架构中创建 sym_* 表、包和 true 这就是我想做的,但是怎么做呢?它试图自己创建这些表,我没有指示它这样做。我在哪里指定数据库架构? 您可以在 sym_trigger 和其他配置同步的 sym_* 表中声明架构 谢谢!事实证明,最重要的是,Azure 门户提供的 jbdc URL 格式不正确。编辑后,SymmetricDS 不再使用主数据库。它仍然告诉我“azure”节点的同步 url 是空白的,但是......有什么想法吗?

以上是关于将 SymmetricDS 与 Azure SQL 数据库一起使用时的权限问题的主要内容,如果未能解决你的问题,请参考以下文章

symmetricds 3.10.4 将数据从 oracle 推送到 postgres

SymmetricDS 完全配置安装手册

SymmetricDS 完全配置安装手册

SymmetricDS 只同步一种方式

SymmetricDS:保持单独的自动增量计数器

Spring Boot 应用程序中的 SymmetricDS