وبلاگ وحید نوروزی

تجربه و ترجمه و تحقیق درباره اوراکل را در این وبلاگ خواهید یافت.

وبلاگ وحید نوروزی

تجربه و ترجمه و تحقیق درباره اوراکل را در این وبلاگ خواهید یافت.

  • ۰
  • ۰

تو این نوشته سعی می کنم درباره تمامی مراحلی که یک دیتابیس بصورت standalone نصب میشه صبحت کنم. تلاشم اینه که روی قسمت preinstallation تمرکز بیشتری کنم که مقادیری که تنظیم می کنیم رو کاملاً درک کنیم.

اول یه ماشین روی vitrualbox می سازیم. 

با انتخاب نام ماشین که در آن کلمه oracle وجود دارد، virtualbox متوجه نصب این محصول می شود و سیستم عامل را متناسب انتخاب می کند. اینکار می تواند بصورت دستی هم صورت پذیرد. حداقل ram مورد نیاز برای oracle 12c r2 برابر 8G می باشد. همچنین دیسک جدیدی را در مرحله بعد باید بسازیم.

 

در محیط تستی فضایی برابر 60G را به نصب سیستم عامل اختصاص می دهیم. 

 

من در محیط تستی خودم یک DNS تعریف کردم و بنابراین برای اینکه باقی سرورهایی که ممکن است بعدها با این سرور کار داشته باشند ، همدیگر را ببینند،همه رو در یک شبکه LOCAL قرار دادم. 

 

زمانی که روی POWER این ماشین کلیک کنیم و بخواهیم روشنش کنیم، باید آدرس ISO مربوط به اوراکل رو بهش بدیم. چون از سایت اوراکل به سختی میشه دانلود کرد، پیشنهاد می کنم یه سر هم به سایت DISTROWATCH بزنید.

 

 

روی INSTALL کلیک می کنیم.

زبان پیش فرض رو انتخاب می کنیم و CONTINUE رو می زنیم.

 

در این صفحه با قسمت های SOFTWARE SELECTION  و   INSTALLATION DESTINATION کار داریم.

 

در حالت MINIMAL گزینه های COMPATIBILITY LIBRARY و DEVELOPMENT TOOL را انتخاب می کنیم و بر روی DONE کلیک می کنیم.

 

در این نصب پارتشنها رو به صورت STANDARD انتخاب میکنیم. با نظر SYSAdmin می توانیم lvm هم کانفیگ کنیم. فضایی که برای این نصب در نظر گرفته ایم اینطور است:

15 /

swap 4

1 boot/

40 u01/

روی accept changes کلیک می کنیم و بعد از وارد شدن به صفحه تنظیمات دکمه begin installation  را می زنیم.

 

در حین نصب پسورد مربوط به کاربر root را تنظیم می کنیم.

 

 

با اتمام نصب بر روی دکمه reboot کلیک می کنیم.

 

این صفحه اولی هست که بهش بر میخوریم. با root وارد می شویم.

 

 

فایل بالا رو به شکل زیر عوض می کنیم.

بعد با زدن دستور زیر تنظیمات شبکه رو Reset می کنیم.

[root@oracle12cr2 ~]# systemctl restart network

برای اینکه بتونیم بهش ssh بزنیم، فعلاً firewall رو غیر فعال می کنیم.

[root@oracle12cr2 ~]# systemctl stop firewalld
[root@oracle12cr2 ~]# systemctl disable firewalld

در قدم اول از preinstallation می خواهیم dvd مربوط به oracle linux 7u4 رو یکبار دیگه به این ماشین بشناسونیم و با کانفیگ yum rpmهای مورد نیاز رو نصب کنیم.

iso را روی این سرور دوباره mount می کنیم:

[root@oracle12cr2 ~]# mount -o ro /dev/cdrom /mnt/

حالا با انجام کارهای زیر، یک yum repository local می سازیم.

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

[root@oracle12cr2 ~]# mv /etc/yum.repos.d/* /tmp/

فایلی با نام local.repo در همین مسیر می سازیم :

[root@oracle12cr2 ~]# vi /etc/yum.repos.d/local.repo

 

محتوای فایل به اینصورت خواهد بود:
[LocalRepo]
name=LocalRepository
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/RPM-GPG-KEY-oracle
که در آن 
[LocalRepo] نام این قسمت
name نام repository
baseurl مسیر پکیجها
enable برای فعال کردن repository
gpgcheck فعلا کردن نصب secure
gpgkey کلید برای نصب secure است.
اگر gpgcheck غیرفعال باشد، دیگر نیازی به gpgkey نیست.
 
دستور بعدی دستوری yum clean all است:
[root@oracle12cr2 ~]# yum clean all

حالا می توانیم با زدن دستور زیر اقدام به نصب 

oracle-database-server-12cR2-preinstall-1.0-3.el7.x86_64.rpm

کنیم. این دستور هم کاربر اوراکل و هم گروه های مورد نیاز این کاربر را می سازد. همچنین بخش بزرگی از پارمترهای مورد نیاز در sysctl را تنظیم می کند. 

[root@oracle12cr2 ~]# yum install -y oracle-database*

 

حالا با زدن دستور id oracle می توانید این کاربر را ببنید که ساخته شده است. 
[root@oracle12cr2 ~]# id oracle

uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba)
 
پسورد کاربر اوراکل را تنظیم می کنیم:
[root@oracle12cr2 ~]# passwd oracle

دو نصب دیگر نیز با yum انجام می دهیم. یکی oracleasm است که برای کانفیگ دیسکهای ASM استفاده می شود و دیگری بنا بر عادت شخصی دستور vim است که سلیقه ای است. 

در مورد oracleasm این نکته را اضافه کنم که بر خلاف ورژن 6 ، oracleasmlib در دل کرنل oracle linux 7 وجود دارد و نیازی به نصب آن نیست.

 

[root@oracle12cr2 ~]# yum install -y oracleasm*
[root@oracle12cr2 ~]# yum install -y vim
محل بعدی که با آن کار داریم تنظیمات مربوط به hostname و همچنین فایل etc/hosts/ است. در این زمینه دقت کنید که اگر حتی نام سرور از طریق دستور nslookup و ذر dns میتواند resolve شود، با این حال در etc/hosts/ بگنجانیم. هم با domain  و هم بدون آن:
[root@oracle12cr2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.15   oracle12cr2     oracle12cr2.vahidnow.lab

همچنین با دستور زیر نام hostname را تنظیم می کنیم:

[root@oracle12cr2 ~]# hostnamectl set-hostname oracle12cr2.vahidnow.lab
 

حالا به سراغ فایل etc/selinux/config/ می رویم و مقدار آن را برابر disabled قرار می دهیم.

[root@oracle12cr2 ~]# cat /etc/selinux/config

 

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled
 

 

در محیطهای RAC یکی بودن زمان سرورها بسیار اهیمت دارد. با اینکه ما میخواهیم بصورت standablone دیتابیسمون رو نصب کنیم، ولی این نکته رو هم رعایت می کنیم. در این باره از سرویسهای که برای SYNC TIME هست استفاده می کنیم. تو اینجا کنار DNS من NTP هم راه انداختم. از سرویس chrony به عنوان client استفاده می کنیم:

[root@oracle12cr2 ~]# systemctl enable chronyd
[root@oracle12cr2 ~]# systemctl restart chronyd
[root@oracle12cr2 ~]# vi /etc/chrony.conf

 

قسمت مربوط به server رو به صورت زیر تغییر میدیم. من خطهای دیگر مربوط به server رو پاک کردم و فقط یک خط رو نگه داشتم.
[root@oracle12cr2 ~]# cat /etc/chrony.conf | grep server
server 192.168.56.103  iburst
یکبار دیگه سرویس رو ریستارت می کنیم و با دستور chronyc sources این مسئله رو چک می کنیم.
[root@oracle12cr2 ~]# systemctl restart chronyd
[root@oracle12cr2 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* vahidnow.lab                 10   6    17    13  -1443ns[ -204us] +/- 1023us
 
گروه بندی و ساخت کاربران اوراکل می تواند به دو صورت انجام بشه. یکی اینکه تمام نصب ها که شامل grid infrastructure  و database هست با یک کاربر انجام بشه و دیگری اینکه این وظایف جدا بشوند و هر کدام تحت کاربر مشخصی انجام بشه که معمولاً نامهای grid و oracle رو بهشون تخصیص میدیم.
اگر بخواهیم که تمامی نصب ها تحت فقط یک کاربر باشد ، باید سه گروه دیگر نیز بسازیم و کاربر oracle را عضو آن گروه ها هم بکنیم. 
[root@oracle12cr2 ~]# groupadd -g 54327 asmdba
[root@oracle12cr2 ~]# groupadd -g 54328 asmoper
[root@oracle12cr2 ~]# groupadd -g 54329 asmadmin
و با دستور usermod تغییری که می خوایم رو اعمال می کنیم:
[root@oracle12cr2 ~]# usermod -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba oracle
[root@oracle12cr2 ~]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba),54327(asmdba),54328(asmoper),54329(asmadmin)
اما اگر بخواهیم کاربران رو جدا کنیم باید کاربر grid رو بصورت زیر بسازیم و کاربر oracle را به همان صورت پیش فرض قبول کنیم:
useradd -m -u 1100 -g oinstall -G asmadmin,asmdba,asmoper,dba -d /home/grid -s /bin/bash grid
ما نصبمان را تنها با کاربر oracle ادامه می دهیم.
پوشه های لازم برای نصب دیتابیس و grid infrastructure را می سازیم:
[root@oracle12cr2 ~]# mkdir -p /u01/app/oracle/12.2.0/grid
[root@oracle12cr2 ~]# mkdir -p /u01/app/oracle/product/12.2.0/db_1
[root@oracle12cr2 ~]# chown -R oracle:oinstall /u01
[root@oracle12cr2 ~]# chmod -R 775 /u01/
در صورتی که از grid و oracle برای نصب استفاده می کردیم، باید بصورت زیر می ساختیم:
mkdir -p /u01/app/grid
mkdir -p /u01/app/grid/12.2.0/grid
chown -R grid:oinstall /u01
mkdir -p /u01/app/oracle
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01

اما. حالا رسیدیم به جای قشنگ ماجرا. اونجایی که خیلی هامون شاید فقط کپی می کنیم ، غافل از اینکه هر کدوم از این اعداد و مقادیر، می تونه تاثیر مستقیم در performance دیتابیس داشته باشه. 

وقتی با دستور yum پکیج oracle-database رو نصب کردیم، یکی از جاهایی که تغییر داد، فایل sysctl.conf در زیر etc بود.

# oracle-database-server-12cR2-preinstall setting for fs.file-max is 6815744
fs.file-max = 6815744

# oracle-database-server-12cR2-preinstall setting for kernel.sem is '250 32000 100 128'
kernel.sem = 250 32000 100 128

# oracle-database-server-12cR2-preinstall setting for kernel.shmmni is 4096
kernel.shmmni = 4096

# oracle-database-server-12cR2-preinstall setting for kernel.shmall is 1073741824 on x86_64
kernel.shmall = 1073741824

# oracle-database-server-12cR2-preinstall setting for kernel.shmmax is 4398046511104 on x86_64
kernel.shmmax = 4398046511104

# oracle-database-server-12cR2-preinstall setting for kernel.panic_on_oops is 1 per Orabug 19212317
kernel.panic_on_oops = 1

# oracle-database-server-12cR2-preinstall setting for net.core.rmem_default is 262144
net.core.rmem_default = 262144

# oracle-database-server-12cR2-preinstall setting for net.core.rmem_max is 4194304
net.core.rmem_max = 4194304

# oracle-database-server-12cR2-preinstall setting for net.core.wmem_default is 262144
net.core.wmem_default = 262144

# oracle-database-server-12cR2-preinstall setting for net.core.wmem_max is 1048576
net.core.wmem_max = 1048576

# oracle-database-server-12cR2-preinstall setting for net.ipv4.conf.all.rp_filter is 2
net.ipv4.conf.all.rp_filter = 2

# oracle-database-server-12cR2-preinstall setting for net.ipv4.conf.default.rp_filter is 2
net.ipv4.conf.default.rp_filter = 2

# oracle-database-server-12cR2-preinstall setting for fs.aio-max-nr is 1048576
fs.aio-max-nr = 1048576

# oracle-database-server-12cR2-preinstall setting for net.ipv4.ip_local_port_range is 9000 65500
net.ipv4.ip_local_port_range = 9000 65500

اولین گزینه fs.file-max = 6815744 است. که به معنی ماکزیمم open files در سیستم عامل لینوکس است. برای اینکه وضعیت فعلی را ببینیم، می توانیم دستور زیر را اجرا کنیم:

[root@oracle12cr2 ~]# cat /proc/sys/fs/file-nr
1024    0       6815744

 

که عدد 1024 به معنی file handle در حال حاضر، عدد 0 به معنی file handle بدون استفاده ولی اختصاص داده شده و عدد 6815744 به معنی ماکزیمم عدد ممکن است.
برای اطلاعات بیشتر در این مورد به اینجا یا اینجا مراجعه کنید

 

گزینه بعدی kernel.sem = 250 32000 100 128 است.  برای دیدن معانی هر کدام از این اعداد که مربوط به semaphore می شوند ، می توان دستور ipsc -l را زد:

[root@oracle12cr2 ~]# ipcs -l

------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4294967296
max total shared memory (kbytes) = 4294967296
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767

 

مفهوم semaphore در قالب IPC که مخفف Inter-Process Communication تعریف می شود. این تکنیک برای مدیریت دسترسی پروسس ها به منابع استفاده شده و به دو منظور مورد استفاده قرار می گیرد: اول به اشتراک گذاری قسمتی از مموری و دوم به اشتراک گذاری دسترسی به فایلها. 
همانطور که از دستور بالا مشخص است، اعدادی نظیر آنچه ما تنظیم کرده ایم در خروجی دستور ipcs -l  دیده می شود.
برای اطلاعات بیشتر به اینجا و یا اینجا مراجعه کنید.
 
سه گزینه بعدی را با هم بررسی می کنیم که kernel.shmmni = 4096 و kernel.shmall = 1073741824 و kernel.shmmax = 4398046511104  هستند. shm  که مخفف shared memory هست اجازه ارتباط بین پروسس ها با یکدیگر را در ناجیه هایی که به عنوان memory segment می دهد. در مورد اوراکل memory segment ها توسط sga استفاده می شود که دیتا و control information استفاده می شود. بصورت پیش فرض در لینوکس 7 میزان shared memory pages به اندازه زیادی تنظیم شده است اما اندازه مناسب بستگی به سایز sga مجموع instanceهایی دارد که بر روی این سرور در حال اجراست. 
shmmax ماکزیمم سایزی است که با واحد bytes به هر segment از shared memory اختصاص می یابد. در صورتی که این عدد از sga ما کوچک تر باشد، باید چند segment متفاوت در مموری به آن اختصاص یابد.
shmall ماکزیمم تعداد pgae هاست که تنظیم می شود. نکته مهم در مورد تنظیم shmall این است  که همیشه باید کمتر از میزان کل رم و بیشتر یا مساوری مجموع sga ها باشد. در صورتی که این عدد درست تنظیم نشده باشد با خطای ora-27102 out of memory  مواجه می شویم. 
برای مشخص شدن این عدد فرض کنیم 6 گیگ رم داریم که میخواهیم 5 گیگ آن را به اوراکل بدهیم. اول این 5 گیگ را به byte تبدیل می کنیم و سپس تقسیم بر page_size می کنیم. برای اینکه بدانیم سایز page چقدر است از دستور زیر استفاده می کنیم:
 
 
[root@oracle12cr2 ~]# getconf PAGE_SIZE
4096

پارامتر بعدی shmmni است. این گزینه به معنی حداکثر تعداد memory segment است. برای اینکه این اعداد را ببینیم می توانیم باز از دستور ipcs -lm استفاده کنیم.

[root@oracle12cr2 ~]# ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4294967296
max total shared memory (kbytes) = 4294967296
min seg size (bytes) = 1

 

پارامتر مهم بعدی panic_on_oops است که در preinstallation برابر یک قرار می دهیم.

kernel.panic_on_oops = 1

این پارامتر در این جهت است که در صورتی که باگ یا مشکلی برای کرنل مشاهده شد، رفتار سیستم عامل به چه صورت باشد. در صورتی که برابر صفر باشد، با وجود مشکل ادامه کار می دهد ولی در صورتی که برابر غیر از صفر باشد، سیستم reboot خواهد شد. اطلاعات بیشتر را می توانید از اینجا یا اینجا مطالعه کنید.

همچنین می توانیم با اضافه کردن پارامتر زیر ، میزان زمانی که در واحد ثانیه منتظر می ماند که سرور بعد از panic ریستارت شود را مشخص کنیم.

kernel.panic = 30

 

قدم بعدی، کانفیگ پارامترهای مربوط به بافر شبکه هست. در اینجا ما چهار پارامتر رو داریم که به ترتیب به سراغشون میریم. از این چهار پارامتر ، دو پارامتر مربوطه به خواندن که با rmem نشون داده میشن و دو پارامتر مربوط به نوشتن که با wmem نوشته می شوند. همچنین هر کدوم از این دو قسمت به دو قسمت default و max میان که اسمشون گویای مطلب هست. بین داکیومنتهایی که جستجو کردم برای این مطلب، تنها دو نوشته زیر توضیح داشتند در مورد معنای پارامترها و مابقی داکیومنتها اکثرا تنها به عددی که باید تنظیم بشه، اکتفا کرده بودند. اون دو داکیومنت رو میتونید از اینجا و اینجا پیدا کنید.

بصورت پیش فرض سایز rmem و wmem و همچنین میزانی که می تواند رشد کند، برای اوراکل کافی نیست. اوراکل پیشنهاد می کند اعداد زیر رو برای اینکار تنظیم کنیم:

 

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

نکته ای که وجود داره اینه که میزان فضای مورد نیاز اینها از طریق رم اختصاص داده میشه و برای برنامه هایی مثل dns کفایت میکنه . پس اگر این سوال براتون پیش میاد که چرا بصورت پیش فرض این عدد بالا نیست، برای این هست که برای برنامه هایی که ترافیک زیادی روی شبکه ندارند، عدد پیش فرض کافی هست.

 

دو پارامتر بعدی مربوط به rp_filter است که اول باید با مفهوم reverse path آشنا شویم.  زمانی که هکرها بخواهند ddos انجام دهند یا شیوه authentication شبکه ای را متوجه شوند، از یک آدرس fake برای ارسال پکتها استفاده می کنند به این کار ip address spoofing  می گویند. در لینوکس سیستمی مانند دستگاه شبکه ای وجود دارد که در صورتی که آدرس وارد شده قابل route شدن باشد، آن packet را قبول می کند و در غیر اینصورت آنرا drop  می کند. در صورتی که بخواهیم اصلا چنین چیزی چک نشود عدد 0، در صورتی که بخواهیم تنها از همان کارت شبکه قابل route باشد عدد 1 و در صورتی که بخواهیم از هر کارت شبکه ای قابل route  باشد عدد 2 را وارد می کنیم. بنابراین تنظیمات زیر را برای این دو مورد قرار می دهیم. توضیحات تکمیلی را می توانید از اینجا مطالعه کنید.

net.ipv4.conf.all.rp_filter = 2

net.ipv4.conf.default.rp_filter = 2

برای پارامتر aio-max-nr اوراکل داکیومنت شماره 2229798.1 را ارائه کرده است. در این داکیومنت نحوه محاسبه این پارامتر را بصورت زیر بیان کرده است:

 

aio-max-nr =no of process per DB * no of databases * 4096

حالا این پارامتر چه کاری برای ما انجام می دهد؟ این پارامتر به پروسس اجازه می دهد که تا چندین i/o را استفاده کند بدون اینکه منتظر اتمام هر کدام از آنها باشد. این پارامتر ماکزیمم این تعداد را مشخص می کند.

 

fs.aio-max-nr = 1048576

اما آخرین گزینه در sysctl‌ مربوطه به net.ipv4.ip_local_port_range است. این پارامتر محدوده آدرس پورتهای لوکال را برای انتخاب توسط پروسسها در پروتکلهای tcp و udp مشخص می کند. پیشنهاد اوراکل مقدار زیر است:

net.ipv4.ip_local_port_range = 9000 65500

 

 

 

 

  • ۹۸/۰۹/۱۲
  • قدیر نوروزی میرصادقی

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی