اجرای دیتابیس در محیط داکر می تواند مزایای متعددی را به همراه داشته باشد، که به عنوان نمونه می توان به “سادگی و افزایش سرعت در نصب و راه اندازی”، “اجرای نسخه های متعدد در یک هاست” و یا “اجرای دیتابیس در سیستم عاملهایی که امکان نصب مستقیم دیتابیس بر روی آنها وجود ندارد”، اشاره کرد.
در این مستند قصد داریم با گرفتن 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
Useame: [email protected]
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)))
Coecting 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.
Coected 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> Discoected 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: ruing /opt/oracle/scripts/extensions/setup/savePatchSummary.sh
/opt/oracle/runUserScripts.sh: ruing /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: ruing /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.
Coected 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.
Coected 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/[email protected]: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
ایمیل:[email protected]
تالار های تخصصی...
ما را در سایت تالار های تخصصی دنبال میکنید
برچسب: نویسنده: خنجی بازدید: 159 تاريخ: شنبه 21 آبان 1401 ساعت: 22:02