اجرای دیتابیس اوراکل با داکر

اجرای دیتابیس در محیط داکر می تواند مزایای متعددی را به همراه داشته باشد، که به عنوان نمونه می توان به “سادگی و افزایش سرعت در نصب و راه اندازی”، “اجرای نسخه های متعدد در یک هاست” و یا “اجرای دیتابیس در سیستم عاملهایی که امکان نصب مستقیم دیتابیس بر روی آنها وجود ندارد”، اشاره کرد.

در این مستند قصد داریم با گرفتن image از Oracle Container Registry، دیتابیس اوراکل را در محیط داکر اجرا کنیم برای این کار ابتدا باید در سایت oracle.com امور مقدماتی نظیر ایجاد اکانت را انجام دهیم و با توجه به انکه این متن بیشتر برای افرادی که با دیتابیس اوراکل آشنا نیستند، نوشته شده است، تمامی مراحل را با جزییات شرح داده ایم.

 

ساخت اکانت در oracle.com

در قدم اول اگر اکانتی در سایت اوراکل ندارید، با رفتن به آدرس زیر، این اکانت را ایجاد کنید:

https://profile.oracle.com/myprofile/account/create-account.jspx

 

لاگین به Oracle Container Registry

پس از ایجاد اکانت، برای گرفتن image باید به Oracle Container Registry رفته و در صفحهOracle Standard Terms and Restrictions””،  License Agreement … مربوط به enterprise edition را accept کنیم:

https://container-registry.oracle.com/

بعد از  انجام گامهای فوق، با اجرای دستور زیر به Oracle Container Registry لاگین می کنیم:

[root@OEL8 ~]# docker login container-registry.oracle.com
Username: vahidusefzadeh@gmail.com
Password: 
Login Succeeded

توجه! اگر مراحل قبلی به خوبی انجام نشود، ممکن است با خطای زیر مواجه شویم:

[root@OEL8 ~]# docker pull container-registry.oracle.com/database/enterprise:latest
Trying to pull repository container-registry.oracle.com/database/enterprise ... 
repository container-registry.oracle.com/database/enterprise not found: does not exist or no pull access

 

دانلود image از Oracle Container Registry

بعد از لاگین به Oracle Container Registry، همه چیز برای اجرای دستور Docker pull و گرفتن image اوراکل 21c فراهم شده است. با اجرای دستور زیر، این image را دانلود می کنیم:

[root@OEL8 ~]# docker pull container-registry.oracle.com/database/enterprise:latest
Trying to pull repository container-registry.oracle.com/database/enterprise ... 
latest: Pulling from container-registry.oracle.com/database/enterprise
401a42e1eb4f: Pulling fs layer 
a13a3f09d2fa: Pulling fs layer 
a55a58a3063b: Pulling fs layer 
d6422a9150b2: Pulling fs layer 
3f5226c779db: Pulling fs layer 
66207182418e: Pull complete 
4f4fb700ef54: Pull complete 
6301a5016e85: Pull complete 
2128b7461b3d: Pull complete 
230583c9b6af: Pull complete 
03a70c5def3e: Pull complete 
b0c50ef7f6ce: Pull complete 
ad5d40d1ad41: Pull complete 
1df8da7ded44: Pull complete 
8468eaae030d: Pull complete 
f6a297cf3e35: Pull complete 
d2cf778aef3c: Pull complete 
7fc2e6378f82: Pull complete 
d75364e69c1f: Pull complete 
ab367856c5a4: Pull complete 
c7a06d3cf4b4: Pull complete 
ecf69af16abc: Pull complete 
6d7250093d8c: Pull complete 
abdc267d415e: Pull complete 
6901acfc36f9: Pull complete 
626ae36f0ce1: Pull complete 
Digest: sha256:bcd69bfc2ef9ca3bd951c7003313727a6f5681eddb04ba0217ff7e5549e68aa6
Status: Downloaded newer image for container-registry.oracle.com/database/enterprise:latest

توجه: در نظر داشته باشید که فضای کافی بر روی ماشین مجازی موجود باشد در غیر این صورت با خطای no space left on device مواجه خواهیم شد:

failed to register layer: Error processing tar file(exit status 1): write /opt/oracle/product/21c/dbhome_1/python/lib/python3.9/site-packages/pandas/_libs/tslibs/timedeltas.cpython-39-x86_64-linux-gnu.so: no space left on device

بعد از کامل شدن فرایند pull، در لیست imageها، image مربوط به دیتابیس اوراکل را خواهیم دید:

[root@OEL8 ~]# docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
container-registry.oracle.com/database/enterprise   latest              085b78f09b56        3 months ago        8.15 GB

 

اجرای container

قصد داریم containerای را با نام db21c اجرا کنیم برای این کار، به 2GB فضای RAM و 21GB فضای دیسک نیاز است. دستور زیر می تواند دیتابیسی را با تنظیمات پیش فرض  ایجاد کند. البته در ادامه همین متن، به custom کردن قسمت های مختلف آن خواهیم پرداخت.

[root@OEL8 ~]# docker volume create OracleVOL
OracleVOL
[root@OEL8 ~]# docker run --name db21c -p 1521:1521 -v OracleVOL:/opt/oracle/oradata container-registry.oracle.com/database/enterprise:latest
 [2022:09:08 19:11:53]: Acquiring lock .ORCLCDB.create_lck with heartbeat 30 secs
[2022:09:08 19:11:53]: Lock acquired
[2022:09:08 19:11:53]: Starting heartbeat
[2022:09:08 19:11:53]: Lock held .ORCLCDB.create_lck
ORACLE EDITION: ENTERPRISE
LSNRCTL for Linux: Version 21.0.0.0.0 - Production on 08-SEP-2022 19:11:53
Copyright (c) 1991, 2021, Oracle.  All rights reserved.
Starting /opt/oracle/product/21c/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 21.0.0.0.0 - Production
System parameter file is /opt/oracle/homes/OraDB21Home1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/3c9e72f28e21/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 21.0.0.0.0 - Production
Start Date                08-SEP-2022 19:11:53
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/homes/OraDB21Home1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/3c9e72f28e21/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Prepare for db operation
8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete
40% complete
43% complete
46% complete
Completing Database Creation
51% complete
54% complete
Creating Pluggable Databases
58% complete
77% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
 /opt/oracle/cfgtoollogs/dbca/ORCLCDB.
Database Information:
Global Database Name:ORCLCDB
System Identifier(SID):ORCLCDB
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ORCLCDB/ORCLCDB.log" for further details.
SQL*Plus: Release 21.0.0.0.0 - Production on Thu Sep 8 19:20:55 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> 
System altered.
SQL> 
System altered.
SQL> 
Pluggable database altered.
SQL> 
PL/SQL procedure successfully completed.
SQL> SQL> 
Session altered.
SQL> 
User created.
SQL> 
Grant succeeded.
SQL> 
Grant succeeded.
SQL> 
Grant succeeded.
SQL> 
User altered.
SQL> SQL> Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
The Oracle base remains unchanged with value /opt/oracle
Executing user defined scripts
/opt/oracle/runUserScripts.sh: running /opt/oracle/scripts/extensions/setup/savePatchSummary.sh
/opt/oracle/runUserScripts.sh: running /opt/oracle/scripts/extensions/setup/swapLocks.sh
[2022:09:08 19:20:59]: Releasing lock .ORCLCDB.create_lck
[2022:09:08 19:20:59]: Lock released .ORCLCDB.create_lck
[2022:09:08 19:20:59]: Acquiring lock .ORCLCDB.exist_lck with heartbeat 30 secs
[2022:09:08 19:20:59]: Lock acquired
[2022:09:08 19:20:59]: Starting heartbeat
[2022:09:08 19:20:59]: Lock held .ORCLCDB.exist_lck
DONE: Executing user defined scripts
The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
Executing user defined scripts
/opt/oracle/runUserScripts.sh: running /opt/oracle/scripts/extensions/startup/runDatapatch.sh
Datafiles are already patched. Skipping datapatch run.
DONE: Executing user defined scripts
The following output is now a tail of the alert.log:
ORCLPDB1(3):CREATE SMALLFILE TABLESPACE "USERS" LOGGING  DATAFILE  '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT  1280K MAXSIZE UNLIMITED  EXTENT MANAGEMENT LOCAL  SEGMENT SPACE MANAGEMENT  AUTO
ORCLPDB1(3):Completed: CREATE SMALLFILE TABLESPACE "USERS" LOGGING  DATAFILE  '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT  1280K MAXSIZE UNLIMITED  EXTENT MANAGEMENT LOCAL  SEGMENT SPACE MANAGEMENT  AUTO
ORCLPDB1(3):ALTER DATABASE DEFAULT TABLESPACE "USERS"
ORCLPDB1(3):Completed: ALTER DATABASE DEFAULT TABLESPACE "USERS"
2022-09-08T19:20:55.490781+00:00
ALTER SYSTEM SET control_files='/opt/oracle/oradata/ORCLCDB/control01.ctl' SCOPE=SPFILE;
2022-09-08T19:20:55.523215+00:00
ALTER SYSTEM SET local_listener='' SCOPE=BOTH;
ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE
Completed: ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE

بعد از اتمام اجرای دستور فوق، با دستور زیر خواهیم دید که db21c در وضعیت healthy در حال اجرا است:

[root@OEL8 ~]# docker container ls
CONTAINER ID        IMAGE                                                      COMMAND                  CREATED             STATUS                    PORTS               NAMES
3c9e72f28e21        container-registry.oracle.com/database/enterprise:latest   "/bin/sh -c 'exec ..."   11 minutes ago      Up 11 minutes (healthy)                       db21c

البته با توجه به انکه از سوییچ detach در زمان اجرای container استفاده نکردیم، با بستن session مربوطه، Container هم از حالت اجرا خارج خواهد شد. در این صورت برای اجرای مجدد این Container می توانیم از دستور زیر استفاده کنیم.

[root@OEL8 ~]# docker container start db21c
db21c

برای مشاهده پشت صحنه اجرای این دستور، می توان از دستور logs استفاده کرد در انتهای اجرای دستور logs، اطلاعاتی از alert log نمایش داده می شود. با کمک سوییچ f، به صورت انلاین محتویات alert log را پایش می کنیم.

[root@OEL8 ~]# docker container logs -f db21c
The following output is now a tail of the alert.log:
CJQ0 started with pid=57, OS id=311 
Completed:    alter database open
   alter pluggable database all open
Completed:    alter pluggable database all open
2022-09-08T19:29:19.876187+00:00
===========================================================
Dumping current patch information
===========================================================
No patches have been applied
===========================================================
2022-09-08T19:29:21.581600+00:00
ORCLPDB1(3):Resize operation completed for file# 10, fname /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf, old size 337920K, new size 358400K

 

اتصال به دیتابیس ایجاد شده

همانطور که مشاهده کردید دیتابیس با تنظیمات پیش فرض در کانیتنر db21c ایجاد شده است و صرفا از طریق سوییچ -p، پورت 1521 را به بیرون expose کردیم تا بتوانیم خارج از host به این پورت دسترسی داشته باشیم.

بنابرین برای اتصال به دیتابیس ایجاد شده، باید نام دیتابیس یا به طور دقیق تر service_name دیتابیس ایجاد شده را مشخص کنیم. برای این کار نیاز داریم به صورت interactive به container مورد نظر وصل شویم.

[root@OEL8 ~]# docker container exec -it db21c /bin/bash
bash-4.2$ sqlplus "/as sysdba"
SQL*Plus: Release 21.0.0.0.0 - Production on Thu Sep 8 19:44:15 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SQL> show pdbs 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB1                       READ WRITE NO

همانطور که می بینید، PDB با نام ORCLPDB1 ایجاد شده است و به تبع آن، service nameای هم با همین نام ایجاد خواهد شد. قبل از اتصال به این دیتابیس، کاربری را در محیط ORCLPDB1 ایجاد می کنیم:

bash-4.2$ sqlplus "/as sysdba"
SQL> alter session set container=ORCLPDB1;
Session altered.
SQL> create user usef identified by a;
User created.
SQL> grant dba to usef;
Grant succeeded.

برای اتصال به دیتابیس(خارج از هاست)، از ابزار plsql deveopler استفاده کرده ایم:

 

ایجاد دیتابیس به صورت custom

در بستر docker می توان دیتابیس اوراکل را به صورت سفارشی ایجاد کرد مثلا می توان نام دیتابیس، نوع CHARACTERSET، میزان حافظه مصرفی و … را به مقداری دلخواه تنظیم کرد. این کار از طریق متغیرهای محیطی زیر قابل انجام است:

docker run -d --name <container_name> \
 -p <host_port>:1521 -p <host_port>:5500 \
 -e ORACLE_SID=<your_SID> \
 -e ORACLE_PDB=<your_PDBname> \
 -e ORACLE_PWD=<your_database_password> \
 -e INIT_SGA_SIZE=<your_database_SGA_memory_MB> \
 -e INIT_PGA_SIZE=<your_database_PGA_memory_MB> \
 -e ORACLE_EDITION=<your_database_edition> \
 -e ORACLE_CHARACTERSET=<your_character_set> \
 -e ENABLE_ARCHIVELOG=true \
 -v [<host_mount_point>:]/opt/oracle/oradata \
container-registry.oracle.com/database/enterprise:21.3.0.0

برای دوستانی که با دیتابیس اوراکل آشنایی ندارند، کاربرد هر کدام از این متغیرهای محیطی را شرح داده ایم:

ORACLE_SID: نام instance

ORACLE_PDB: نام دیتابیسی که قرار است اطلاعات application در ان ذخیره شود. ما به ازای این نام، service nameای هم ایجاد می شود که برای اتصال به این PDB می توانیم از ان استفاده کنیم.

ORACLE_PWD: پسورد کاربر sys و system که دسترسی بسیار بالایی دارند.

INIT_SGA_SIZE: میزان فضایی که برای shared memory در نظر گرفته می شود. این مقدار به صورت اختصاصی به instance تعلق خواهد گرفت.

 INIT_PGA_SIZE:فضای اختضاصی به PGA

ORACLE_CHARACTERSET: کاراکترست مورد نظر را با این متغیر محیطی تنظیم می کنیم.

ENABLE_ARCHIVELOG: دیتابیس در حالت آرشیولاگ قرار بگیرد(مناسب برای بکاپ گیری از طریق RMAN)؟

ORACLE_EDITION:اوراکل به صورت enterprise نصب شود یا به صورت standard ؟ نسخه enterprise که مقدار پیش فرض است، هزینه و قابلیتهای بیشتری دارد(البته برای خارج از ایران!).

*سوییچ v برای تعریف volume استفاده می شود.

 بعد از آشنایی با پارامترهای فوق، به صورت custom دیتابیسی را در این محیط ایجاد می کنیم.

 [root@OEL8 ~]# docker container run -d --name OracleDatabase21c \
>  -p 1521:1521 -p 5500:5500 \
>  -e ORACLE_SID=IRANDB \
>  -e ORACLE_PDB=TehranDB \
>  -e ORACLE_PWD=KArbar__1401 \
>  -e INIT_SGA_SIZE=2048MB \
>  -e INIT_PGA_SIZE=500MB \
>  -e ORACLE_EDITION=enterprise \
>  -e ORACLE_CHARACTERSET=AL32UTF8 \
>  -e ENABLE_ARCHIVELOG=true \
>  -v OracleVOL:/opt/oracle/oradata \
> container-registry.oracle.com/database/enterprise:latest
9938c1f4c5ffa06a891bf3925a33be57ab4368161a8b152083fed7e27d478c36

با توجه به volume استفاده شده، فایلهای این دیتابیس در مسیر زیر ایجاد شده است:

[root@OEL8 _data]# docker volume inspect --format '{{.Mountpoint}}'  OracleVOL
/var/lib/docker/volumes/OracleVOL/_data
[root@OEL8 ~]# cd /var/lib/docker/volumes/OracleVOL/_data
[root@OEL8 _data]# ls -l
drwxr-xr-x. 3 54321 54321  20 Sep 16 20:22 dbconfig
drwxr-x---. 5 54321 54321 251 Sep 16 20:16 IRANDB
[root@OEL8 _data]# ls -l dbconfig/IRANDB/
-rw-r--r--. 1 54321 54321  114 Sep 16 20:22 IRANDB.lspatches
-rw-r--r--. 1 54321 54321  234 Sep 16 20:14 listener.ora
-rw-r-----. 1 54321 54321 2048 Sep 16 20:16 orapwIRANDB
-rw-r--r--. 1 54321 54321  779 Sep 16 20:22 oratab
-rw-r-----. 1 54321 54322 3584 Sep 16 20:22 spfileIRANDB.ora
-rw-r--r--. 1 54321 54321   54 Sep 16 20:14 sqlnet.ora
-rw-r-----. 1 54321 54321  195 Sep 16 20:22 tnsnames.ora
[root@OEL8 _data]# ls -l  IRANDB
drwxr-x---. 2 54321 54321         32 Sep 16 20:22 archive_logs
-rw-r-----. 1 54321 54322   18726912 Sep 16 20:30 control01.ctl
-rw-r-----. 1 54321 54322   18726912 Sep 16 20:30 control02.ctl
drwxr-x---. 2 54321 54321        111 Sep 16 20:17 pdbseed
-rw-r-----. 1 54321 54322  209715712 Sep 16 20:22 redo01.log
-rw-r-----. 1 54321 54322  209715712 Sep 16 20:22 redo02.log
-rw-r-----. 1 54321 54322  209715712 Sep 16 20:30 redo03.log
-rw-r-----. 1 54321 54322  608182272 Sep 16 20:28 sysaux01.dbf
-rw-r-----. 1 54321 54322 1394614272 Sep 16 20:27 system01.dbf
drwxr-x---. 2 54321 54321        104 Sep 16 20:22 TEHRANDB
-rw-r-----. 1 54321 54322  248520704 Sep 16 20:19 temp01.dbf
-rw-r-----. 1 54321 54322  125837312 Sep 16 20:27 undotbs01.dbf
-rw-r-----. 1 54321 54322    5251072 Sep 16 20:27 users01.dbf

با اتصال به این container، مشخصات دیتابیس را بررسی می کنیم:

[root@OEL8 ~]# docker container exec -it OracleDatabase21c /bin/bash
bash-4.2$ echo $ORACLE_SID
IRANDB
bash-4.2$ sqlplus "/as sysdba"
SQL*Plus: Release 21.0.0.0.0 - Production on Fri Sep 9 20:36:16 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Connected to:
SQL> show parameter instance_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      IRANDB
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TEHRANDB                       READ WRITE NO
SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga            boolean     FALSE
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     TRUE
sga_max_size                         big integer 2G
sga_min_size                         big integer 0
sga_target                           big integer 2G
SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 2G
pga_aggregate_target                 big integer 500M
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /opt/oracle/oradata/IRANDB/archive_logs
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/IRANDB/system01.dbf
/opt/oracle/oradata/IRANDB/sysaux01.dbf
/opt/oracle/oradata/IRANDB/undotbs01.dbf
/opt/oracle/oradata/IRANDB/pdbseed/system01.dbf
/opt/oracle/oradata/IRANDB/pdbseed/sysaux01.dbf
/opt/oracle/oradata/IRANDB/users01.dbf
/opt/oracle/oradata/IRANDB/pdbseed/undotbs01.dbf
/opt/oracle/oradata/IRANDB/TEHRANDB/system01.dbf
/opt/oracle/oradata/IRANDB/TEHRANDB/sysaux01.dbf
/opt/oracle/oradata/IRANDB/TEHRANDB/undotbs01.dbf
/opt/oracle/oradata/IRANDB/TEHRANDB/users01.dbf
bash-4.2$ sqlplus "sys/KArbar__1401@172.17.0.2:1521/tehrandb as sysdba"                 
SQL*Plus: Release 21.0.0.0.0 - Production on Fri Sep 9 20:40:48 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
SQL>

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.