Пользовательское расположение каталога данных Oracle XE для извлечения данных из моих таблиц через перезапуск контейнера Docker - PullRequest
0 голосов
/ 02 июля 2018

Использование образа Docker Oracle XE https://hub.docker.com/r/wnameless/oracle-xe-11g/ Я создал файл docker-compose:

version: "3"
services:
  oracle-xe:
    image: wnameless/oracle-xe-11g:16.04
    ports:
      - "1521:1521"
      - "8084:8080"
    networks:
      - oracle
    environment:
      - ORACLE_ALLOW_REMOTE=true
      - ORACLE_DISABLE_ASYNCH_IO=true
      - ORACLE_ENABLE_XDB=true
    volumes:
      - "~/dev/docker/projects/oracle/volumes/oracle-xe/config/oratab:/etc/oratab"
      -    version: "3"
services:
  oracle-xe:
    image: wnameless/oracle-xe-11g:16.04
    ports:
      - "1521:1521"
      - "8084:8080"
    networks:
      - oracle
    environment:
      - ORACLE_ALLOW_REMOTE=true
      - ORACLE_DISABLE_ASYNCH_IO=true
      - ORACLE_ENABLE_XDB=true
    volumes:
      - "~/dev/docker/projects/oracle/volumes/oracle-xe/config/oratab:/etc/oratab"
      - "~/dev/docker/projects/oracle/volumes/oracle-xe/config/tnsnames.ora:/u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora"
      - "~/dev/docker/projects/oracle/volumes/oracle-xe/data:/u01/app/oracle/product/11.2.0/xe/dbs/data"
networks:
  oracle: "~/dev/docker/projects/oracle/volumes/oracle-xe/config/tnsnames.ora:/u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora"
      - "~/dev/docker/projects/oracle/volumes/oracle-xe/data:/u01/app/oracle/product/11.2.0/xe/dbs/data"
networks:
  oracle:

Я могу запустить контейнер командой:

docker stack deploy --compose-file docker-compose-swarm-dev.yml oracle

и остановите его командой:

docker stack rm oracle

Затем я могу подключиться с хоста Docker:

sqlplus system/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=127.0.0.1)(Port=1521))(CONNECT_DATA=(SID=XE)))

После входа в систему я могу создать табличное пространство и пользователя с его грантами:

create tablespace useraccounttest datafile '/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest.dbf' size 10M autoextend on;
create temporary tablespace useraccounttest_temp tempfile '/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest_temp.dbf' size 5M autoextend on;
create user useraccounttest identified by mypassword default tablespace useraccounttest temporary tablespace useraccounttest_temp;
grant resource to useraccounttest;
grant connect to useraccounttest;
grant create view to useraccounttest;
grant create session to useraccounttest;
grant create sequence to useraccounttest;
grant create table to useraccounttest;
grant unlimited tablespace to useraccounttest;
revoke unlimited tablespace from useraccounttest;

И я могу видеть файлы данных, созданные на моем хосте, благодаря сопоставленному тому:

$ ll ~/dev/docker/projects/oracle/volumes/oracle-xe/data/
total 12M
-rw-r----- 1 stephane  11M juil.  2 14:35 useraccounttest.dbf
-rw-r----- 1 stephane 5,1M juil.  2 14:35 useraccounttest_temp.dbf

С созданным пользователем я могу подключиться, используя этого нового пользователя:

$ sqlplus useraccounttest/mypassword@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=127.0.0.1)(Port=1521))(CONNECT_DATA=(SID=XE)))

SQL*Plus: Release 11.2.0.4.0 Production on Mon Jul 2 14:57:21 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> 

Но если я сейчас остановлю контейнер, а затем запущу контейнер и попытаюсь подключиться с помощью вышеуказанной команды, я получу сообщение о том, что пользователь неизвестен:

ORA-01017: invalid username/password; logon denied

Теперь, если я вхожу в систему как пользователь системы, я пытаюсь выполнить следующие команды, создается впечатление, что табличное пространство не может быть создано, потому что оно уже существует, но в то же время оно непригодно для использования:

SQL> create user useraccounttest identified by mypassword default tablespace useraccounttest temporary tablespace useraccounttest_temp;
create user useraccounttest identified by mypassword default tablespace useraccounttest temporary tablespace useraccounttest_temp
*
ERROR at line 1:
ORA-00959: tablespace 'USERACCOUNTTEST' does not exist


SQL> create tablespace useraccounttest datafile '/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest.dbf' size 10M autoextend on;
create tablespace useraccounttest datafile '/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest.dbf' size 10M autoextend on
*
ERROR at line 1:
ORA-01119: error in creating database file
'/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest.dbf'
ORA-27038: created file already exists
Additional information: 1


SQL> 
SQL> create temporary tablespace useraccounttest_temp tempfile '/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest_temp.dbf' size 5M autoextend on;
create user useraccounttest identified by mypassword default tablespace useraccounttest temporary tablespace useraccounttest_temp;create temporary tablespace useraccounttest_temp tempfile '/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest_temp.dbf' size 5M autoextend on
*
ERROR at line 1:
ORA-01119: error in creating database file
'/u01/app/oracle/product/11.2.0/xe/dbs/data/useraccounttest_temp.dbf'
ORA-27038: created file already exists
Additional information: 1
...