تو این نوشته سعی می کنم درباره تمامی مراحلی که یک دیتابیس بصورت standalone نصب میشه صبحت کنم. تلاشم اینه که روی قسمت preinstallation تمرکز بیشتری کنم که مقادیری که تنظیم می کنیم رو کاملاً درک کنیم.
اول یه ماشین روی vitrualbox می سازیم.
با انتخاب نام ماشین که در آن کلمه oracle وجود دارد، virtualbox متوجه نصب این محصول می شود و سیستم عامل را متناسب انتخاب می کند. اینکار می تواند بصورت دستی هم صورت پذیرد. حداقل ram مورد نیاز برای oracle 12c r2 برابر 8G می باشد. همچنین دیسک جدیدی را در مرحله بعد باید بسازیم.
در محیط تستی فضایی برابر 60G را به نصب سیستم عامل اختصاص می دهیم.
من در محیط تستی خودم یک DNS تعریف کردم و بنابراین برای اینکه باقی سرورهایی که ممکن است بعدها با این سرور کار داشته باشند ، همدیگر را ببینند،همه رو در یک شبکه LOCAL قرار دادم.
زمانی که روی POWER این ماشین کلیک کنیم و بخواهیم روشنش کنیم، باید آدرس ISO مربوط به اوراکل رو بهش بدیم. چون از سایت اوراکل به سختی میشه دانلود کرد، پیشنهاد می کنم یه سر هم به سایت DISTROWATCH بزنید.
زبان پیش فرض رو انتخاب می کنیم و 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
[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*
[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
[root@oracle12cr2 ~]# cat /etc/chrony.conf | grep server server 192.168.56.103 iburst
[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
[root@oracle12cr2 ~]# groupadd -g 54327 asmdba [root@oracle12cr2 ~]# groupadd -g 54328 asmoper [root@oracle12cr2 ~]# groupadd -g 54329 asmadmin
[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)
useradd -m -u 1100 -g oinstall -G asmadmin,asmdba,asmoper,dba -d /home/grid -s /bin/bash grid
[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/
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
گزینه بعدی 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
[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
- ۹۸/۰۹/۱۲