【问题标题】:How can I force flyway to clean my docker oracle database?如何强制 flyway 清理我的 docker oracle 数据库?
【发布时间】:2019-01-16 17:12:58
【问题描述】:

我已经下载了 Oracle Database EE 的官方 oracle docker 镜像。我有一个 flyway 配置,并且经常针对本地安装的 XE 版本的数据库运行 flyway:clean。但是flyway告诉我不允许清理docker镜像中的数据库,但它可以迁移它。

有没有办法强制flyway清理oracle db?

回答 cmets 的问题:

这是通过 maven 运行 flyway 时的错误消息:

org.flywaydb.core.api.FlywayException: Clean not supported on Oracle for system schema "SCHEMA_OWNER"! It must not be changed in any way except by running an Oracle-supplied script! -> [Help 1]

我连接的用户是用alter session set "_ORACLE_SCRIPT"=true;创建的

【问题讨论】:

  • 1) Flyway 的错误信息是什么? 2)您连接的是哪个用户? 3) 如果以自定义用户身份连接,用户是如何创建的,您是否有机会使用 alter session set "_ORACLE_SCRIPT"=true; ORA-65096 的解决方法,如下所述:stackoverflow.com/a/41490385/6797663
  • @codemonkey 我通过更新问题回答了您的问题。

标签: oracle docker oracle12c flyway


【解决方案1】:

如果当前架构被认为是系统架构,Flyway 将throw this exception

@Override
protected void doClean() throws SQLException {
    if (isSystem()) {
        throw new FlywayException("Clean not supported on Oracle for system schema " + database.quote(name) + "! " +
                "It must not be changed in any way except by running an Oracle-supplied script!");
    }

如果架构在known default schemas 的列表中或具有ORACLE_MAINTAINED = 'Y',则该架构被视为系统架构。

使用alter session set "_ORACLE_SCRIPT"=true; 创建用户会为用户/架构设置ORACLE_MAINTAINED = 'Y'

Oracle 12c 中有两种数据库:容器数据库 (CDB) 和可插拔数据库 (PDB)。这是为了支持Multitenancy

您当前正在 CDB 中创建用户,这将是所有 PDB 中的通用用户。在这种情况下,您必须在用户名前加上 c##:

create user c##scott identified by tiger;

或者使用alter session set "_ORACLE_SCRIPT"=true;,否则会报错:

ORA-65096: invalid common user or role name in oracle

另一种方法是连接到 PDB 并在那里创建一个本地用户(不需要前缀,用户将只存在于该 PDB 中),例如:

sqlplus sys/Oradoc_db1@ORCLPDB1 as sysdba

create user scott identified by tiger;

更新 Flyway url 以作为该用户连接到该 PDB:

-url=jdbc:oracle:thin:@oracle-ee:1521/orclpdb1.localdomain -user="scott" -password=tiger

【讨论】:

  • 这解决了我的问题!但是,我似乎无法使用它的 SID 连接到 PDB(如此处所述:store.docker.com/images/oracle-database-enterprise-edition/…)。我只能使用此连接字符串将数据库作为服务来处理:jdbc:oracle:thin:@//localhost:32769/ORCLPDB1.localdomain
  • 是的,我遇到了同样的问题。默认情况下,您只能使用服务名称连接到 PDB。但是,您可以在listener.ora 文件中设置USE_SID_AS_SERVICE_listener=on,然后使用lsnrctl reload 更新侦听器。见oracle-base.com/articles/12c/…
  • 这对我来说现在是个问题,所以我没有弄乱容器;)
  • Creating the user with alter session set "_ORACLE_SCRIPT"=true; sets ORACLE_MAINTAINED = 'Y' for the user / schema. aah,当然,当然,我怎么会不知道这个……
猜你喜欢
  • 2020-10-19
  • 2019-02-17
  • 2019-07-23
  • 2021-09-30
  • 2017-06-15
  • 2014-09-27
  • 2017-04-20
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多