You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器中运行的Oracle FREEPDB初始化时创建带角色权限用户失败的问题

Docker容器中运行的Oracle FREEPDB初始化时创建带角色权限用户失败的问题

Hey there! 看起来你是想在Docker里运行的Oracle FREEPDB初始化阶段,自动创建带合适角色与权限的用户对吧?我之前折腾过这个gvenzl/oracle-free镜像的初始化流程,给你分享几个关键要点和解决方案:

  • 确认初始化脚本的挂载路径
    这个镜像的官方初始化脚本目录是/docker-entrypoint-initdb.d,你docker-compose里写的/docker-entryp应该是没写完,得改成完整路径才行。修正后的volumes配置应该是这样:

    volumes:
      - ./app/src/main/resources/db/changelog/init-scripts:/docker-entrypoint-initdb.d
    

    另外要注意:放在这个目录里的脚本必须是.sql.sql.gz或者.sh格式,容器会按文件名的字典序执行,所以可以给脚本加前缀(比如01-create-user.sql)来保证执行顺序符合你的预期。

  • 编写正确的初始化SQL脚本
    因为你用的是PDB(FREEPDB1),脚本里必须先切换到这个PDB,否则用户会被创建到CDB容器数据库里,后续连接PDB时会找不到这个用户。给你一个示例脚本参考:

    -- 切换到目标PDB实例
    ALTER SESSION SET CONTAINER=FREEPDB1;
    
    -- 创建用户(替换成你需要的用户名和密码)
    CREATE USER myappuser IDENTIFIED BY mysecurepassword DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;
    
    -- 授予基础角色,根据你的业务需求调整
    GRANT CONNECT, RESOURCE TO myappuser;
    -- 如果需要更多权限,比如创建视图、存储过程等,可以追加
    GRANT CREATE VIEW, CREATE PROCEDURE, CREATE SEQUENCE TO myappuser;
    -- 给用户分配表空间的无限配额,避免后续存储不足
    ALTER USER myappuser QUOTA UNLIMITED ON USERS;
    

    要是你用shell脚本执行SQL,记得要指定连接到PDB,示例如下:

    #!/bin/bash
    sqlplus sys/test@FREEPDB1 as sysdba <<EOF
    ALTER SESSION SET CONTAINER=FREEPDB1;
    CREATE USER myappuser IDENTIFIED BY mysecurepassword;
    GRANT CONNECT, RESOURCE TO myappuser;
    ALTER USER myappuser QUOTA UNLIMITED ON USERS;
    EOF
    
  • 检查脚本文件权限
    挂载到容器里的脚本文件,要确保容器内的oracle用户能读取。你可以先给本地的脚本文件设置合适的权限:

    chmod 644 ./app/src/main/resources/db/changelog/init-scripts/*.sql
    

    这样容器就能正常读取并执行脚本了。

  • 验证脚本执行结果
    如果用户还是没创建成功,先看看容器日志里的初始化信息:

    docker logs oracle-db
    

    日志里会明确显示每个初始化脚本的执行状态,有没有报错都会列出来。你也可以直接进入容器连接数据库验证用户是否存在:

    docker exec -it oracle-db sqlplus sys/test@FREEPDB1 as sysdba
    -- 执行查询确认用户
    SELECT username FROM dba_users WHERE username='MYAPPUSER';
    

备注:内容来源于stack exchange,提问作者Denis Labelle

火山引擎 最新活动