Showing posts with label oradim. Show all posts
Showing posts with label oradim. Show all posts

Sunday, May 4, 2014

เปลี่ยนชื่อฐานข้อมูล

โพสต์ครั้งแรก: 28 มกราคม 2012 


เราจะเปลี่ยนชื่อฐานข้อมูลได้หรือเปล่า พรหล้า พรหล้า!พรหล้า SE หญิงคนเดียวในทีม ที่ทำหน้าที่ดูแลฐานข้อมูล Oracle อยู่ ต้องสะดุ้งจากภวังค์ "อะไรคะ ขออีกที จะเปลี่ยนชื่อผู้ดูแลฐานข้อมูลหรือคะ" เธออยากจะให้การฟังผิดของเธอเป็นเรื่องจริงเสียเหลือเกิน เพราะเท่าที่เธอเคยรู้การจะเปลี่ยนชื่อฐานข้อมูล Oracle มันค่อนข้างจะยุ่งยาก แล้วก็เสี่ยงกับการที่เบสจะเจ๊งอีกด้วย

ก่อนที่ Oracle จะเปิดตัวยูทิลิตี้ชื่อ DBNEWID การแก้ไข DBID เป็นเรื่องที่เป็นไปไม่ได้ และการเปลี่ยน DBNAME ก็หลีกเลี่ยงไม่ได้ที่จะต้องสร้าง Controlfile ขึ้นใหม่  แต่ในปัจจุบันเราสามารถใช้ DBNEWID ในการเปลี่ยน DBID และการแก้ไข DB_NAME ก็ง่ายขึ้น การเปลี่ยน DBID เป็นสิ่งที่จำเป็นเมื่อคุณต้องการใช้ Catalog ของ RMAN เพื่อแบ็คอัพ Database ที่ Clone มาเนื่องจาก RMAN จะรู้จักและระบุถึง Databaseแต่ละตัว โดยใช้ DBID, ฐานข้อมูลที่ Clone มาจะมี DBID เดียวกันกับตัวต้นฉบับ ทำให้ไม่สามารถใช้ Catalog ชุดเดียวกันในการจัดการฐานข้อมูลทั้งสองได้ ซึ่งการสามารถเปลี่ยน DBID ได้ ทำให้ข้อจำกัดนี้หายไป

ขั้นตอนการเปลี่ยน DBID และ DBNAME พร้อม ๆ กันด้วย DBNEWID
  • แบ็คอัพฐานข้อมูล
  • Shutdown แบบสะอาด ๆ
sys@ORCL92> startup mount
sys@ORCL92> shutdown immediate
  • รันยูทิลิตี้ DBNEWID (nid) บน OS Prompt โดยระบุ DBNAME ตัวใหม่ ในคำสั่งนี้เราจะต้องใช้ Username และ Password ที่มีสิทธิ์ SYSDBA ด้วย
C:\> nid TARGET=sys/password@ORCL92 DBNAME=PROD
  • ถ้าไม่มีปัญหาอะไร จะมี Prompt เพื่อให้เราตอบยืนยันตอบ "Y" เพื่อยืนยัน จะได้ Output คล้าย ๆ ข้างล่าง
C:\> nid TARGET=sys@ORCL92 DBNAME=PROD
DBNEWID: Release 9.2.0.8.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

Password:
Connected to database ORCL92 (DBID=2529228049)

Control Files in database:
C:\ORACLE\ORADATA\ORCL92\CONTROL01.CTL
C:\ORACLE\ORADATA\ORCL92\CONTROL02.CTL
C:\ORACLE\ORADATA\ORCL92\CONTROL03.CTL

Change database ID and database name ORCL92 to PROD? (Y/[N]) =>Y

Proceeding with operation
Changing database ID from 2529228049 to 185608941
Changing database name from ORCL92 to PROD
Control File C:\ORACLE\ORADATA\ORCL92\CONTROL01.CTL - modified
Control File C:\ORACLE\ORADATA\ORCL92\CONTROL02.CTL - modified
Control File C:\ORACLE\ORADATA\ORCL92\CONTROL03.CTL - modified
Datafile C:\ORACLE\ORADATA\ORCL92\SYSTEM01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\TESTBLOCK.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\CWMLITE01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\DRSYS01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\EXAMPLE01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\INDX01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\ODM01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\TOOLS01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\USERS01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\XDB01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\LOGMNR_TS01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\PERFSTAT01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\TEST_IMP01.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\UNDOTBS01.DBF - dbid changed, wrote new name
Datafile C:\TEMP1.DBF - dbid changed, wrote new name
Datafile C:\ORACLE\ORADATA\ORCL92\TEMP02.DBF - dbid changed, wrote new name
Control File C:\ORACLE\ORADATA\ORCL92\CONTROL01.CTL - dbid changed, wrote new name
Control File C:\ORACLE\ORADATA\ORCL92\CONTROL02.CTL - dbid changed, wrote new name
Control File C:\ORACLE\ORADATA\ORCL92\CONTROL03.CTL - dbid changed, wrote new name

Database name changed to PROD.
Modify parameter file and generate a new password file before restarting.
Database ID for database PROD changed to 185608941.
All previous backups and archived redo logs for this database are unusable.
Shut down database and open with RESETLOGS option.
Succesfully changed database name and ID.
DBNEWID - Completed succesfully.
  • ล็อกอินเข้าฐานข้อมูลอีกครั้ง แล้ว Shutdown ฐานข้อมูล
sys@ORCL92> shutdown immediate
  • แก้ไขพารามิเตอร์ DB_NAME ในไฟล์พารามิเตอร์ (Initialization Parameter File) ให้ตรงกับชื่อฐานข้อมูลที่เราต้องการ แล้ว Startup Mount ตอน Startup อาจจะมี Error แต่ไม่ต้องสนใจ
sys@ORCL92> startup mount
ORACLE instance started.

Total System Global Area 839984040 bytes
Fixed Size 455592 bytes
Variable Size 419430400 bytes
Database Buffers 419430400 bytes
Redo Buffers 667648 bytes
ORA-01103: database name 'PROD' in controlfile is not 'ORCL92'
  • แก้ไข DB_NAME ใน SPFile โดยใช้คำสั่ง alter และ Shutdown ฐานข้อมูลอีกครั้ง
sys@ORCL92> alter system set db_name=PROD scope=spfile;
sys@ORCL92> shutdown immediate
  • สร้าง Password ไฟล์ใหม่ (ไฟล์ Password ใช้ในการเก็บพาสเวิร์ดของ SYSDBA กรณีที่อนุญาตให้เข้าระบบด้วย SYSDBA จากเครื่อง Client)
c:\> orapwd file=c:\oracle\ora92\database\PWDprod.ora password=manager entries=5
  • ให้มั่นใจว่าพาธที่กำหนดไปยังไฟล์ Password เป็นพาธที่เป็น Oracle Home "\database" (Windows) หรือ "/dbs" (Unix) ส่วนชื่อต้องเป็นฟอร์แมตที่ถูกต้องด้วยคือ "PWDdb_name.ora" เราอาจจะดูจากไฟล์เดิมที่มีอยู่ซึ่งจะเป็นพาสเวิร์ดไฟล์เก่าของ DBNAME เดิมก็ได้
  • จากนั้นเปลี่ยนชื่อ (Rename) SPFile เพื่อให้ตรงกับ DB_NAME ใหม่, ใช่แล้ว Rename แบบดื้อ ๆ เลย
c:\> ren SPFILEORCL92.ORA SPFILEPROD.ORA
  • ถ้าคุณใช้ Windows คุณต้องสร้าง Service ใหม่ด้วยชื่อที่ถูกต้องเพื่อให้ใช้ Parameter File ตัวใหม่ ก่อนจะสร้าง Service ตัวใหม่ ให้ลบตัวเก่าออกก่อน
c:\> oradim -delete -sid prod
c:\> oradim -new -sid PROD -intpwd manager -startmode a -pfile c:\oracle\ora92\database\SPFILEPROD.ORA
  • กรณีที่เป็น Unix หรือ Linux เราแค่ Reset ORACLE_SID (Environment Variable)
$ ORACLE_SID=PROD; export ORACLE_SID
  • จากนั้นให้แก้ Configuration ที่เกี่ยวข้องกับชื่อฐานข้อมูลในไฟล์ที่ listener.ora และไฟล์ tnsnames.ora แล้ว Restart Listener, ไฟล์ทั้งสองปกติจะอยู่ใน %ORACLE_HOME%\network\admin รันคำสั่งข้างล่างบน OS Prompt หลัง Restart Listener ลองเช็คสถานะดู
c:\> lsnrctl reload
c:\> lsnrctl status
  • จากนั้นให้เปิดใช้ระบบฐานข้อมูล โดยจะต้องใช้ Option RESETLOGS การ Reset Logs จะทำให้ Redo Log ถูก Reset ตั้งค่า Sequence เป็น 1 ใหม่ เหมือนเริ่มต้นชีวิตกันใหม่
sys@ORCL92> startup mount
sys@ORCL92> alter database open resetlogs;
  • แบ็คอัพฐานข้อมูลทั้งหมด (แบ็คอัพตัวเก่าของคุณจะใช้ไม่ได้แล้วนะคร๊าบ)
เรียบเรียงจาก DBNEWID Utility, http://www.oracle-base.com/articles/9i/DBNEWID.phpอ่านเพิ่มเติมที่ DBNEWID Utility, Oracle9i Database Utilities Release 2 (9.2)

Friday, April 30, 2010

เซ็ท Parameter ผิด คิดจนหัวบวม

ถ้าเราเซ็ทพารามิเตอร์บางตัวผิด (Oracle ไม่สามารถยอมรับค่านั้นได้) อาจจะทำให้เราไม่สามารถ Startup Database ได้ ดังเช่นตัวอย่างของการตั้งค่าพารามิเตอร์ SGA_MAX_SIZE ซึ่งจะต้อง Restart ระบบฯ หากค่าที่กำหนดเป็นค่าที่ไม่สามารถยอมรับได้ (Invalid) จะทำให้ระบบฯ Startup ไม่ขึ้น ดังเรื่องของสมสรวงที่จะกล่าวถึงต่อไปนี้

สมสรวง ต้องการเพิ่มหน่วยความจำให้กับระบบฐานข้อมูลออราเคิล โดยเขาต้องการให้ฐานข้อมูลใช้หน่วยความจำ 6GB โดยการเซ็ทพารามิเตอร์ SGA_TARGET ซึ่งสามารถทำได้โดยไม่ต้อง Restart ระบบฯ โดย Server มีหน่วยความจำทั้งหมดอยู่ 8GB บนเครื่อง โดยเขาต้องการเซ็ท SGA_MAX_SIZE ให้มากที่สุดเท่าที่จะทำได้ เขาจึงตัดสินใจเซ็ท SGA_MAX_SIZE ให้เท่ากับหน่วยความจำทั้งหมดที่มี

พารามิเตอร์ SGA_MAX_SIZE ใช้ในการกำหนดลิมิตสูงสุดของหน่วยความจำที่สามารถกำหนดให้ SGA_TARGET ได้ เป็นพารามิเตอร์ที่ต้อง Restart ระบบฐานข้อมูลจึงจะมีผล ในขณะที่พารามิเตอร์ SGA_TARGET สามารถกำหนดได้โดยไม่ต้อง Restart ระบบฯ

SQL> alter system set sga_max_size=8g scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-27102: out of memory
OSD-00022: additional error information
O/S-Error: (OS 8) Not enough storage is available to process this command.

เนื่อง จาก SGA_MAX_SIZE เป็นพารามิเตอร์ที่ต้องการการ Restart ระบบฐานข้อมูล แต่เมื่อเขา Startup ฐานข้อมูลปรากฎว่าเขาพบ Error ORA-27102: out of memory และไม่สามารถที่จะเปิดฐานข้อมูลได้เลย

สาเหตุที่เป็นเช่นนี้ เนื่องจาก เมื่อสมสรวงใช้คำสั่ง alter system set sga_max_size=8g scope=spfile นั้น ออราเคิลจะบันทึกค่าของพารามิเตอร์นี้ไว้ในไฟล์ %ORACLE_HOME%\dbs\SPFILEsid.ORA และเมื่อสมสรวงใช้คำสั่ง STARTUP เพื่อเปิดระบบฐานข้อมูล ออราเคิลจะไปอ่านพารามิเตอร์ในไฟล์นี้ในการเปิดระบบ เนื่องจากค่าที่ระบุ SGA_MAX_SIZE มีขนาดเกินกว่าที่หน่วยความจำที่มี (หน่วยความจำที่มีอยู่ 8G นั้นส่วนหนึ่งถูกใช้ไปโดย O/S) จึงไม่สามารถเปิดระบบฐานข้อมูลได้

ผมว่าออราเคิลน่าจะมีฟังก์ชันในการตรวจสอบพารามิเตอร์ใน SPFile ก่อนที่จะยอมปิดระบบฐานข้อมูล และแจ้งเตือนให้ผู้บริหารระบบทราบถึงผล (Error) อันอาจจะเกิดขึ้นหากมีการ Startup ด้วย SPFile ตัวปัจจุบัน

การแก้ไข
ใน %ORACLE_BASE%\admin\orcl10g\pfile\ มีไฟล์พารามิเตอร์ชื่อ init.ora.xxxxxxxxxxxx อยู่ ซึ่งเป็นเท็กซ์ไฟล์ธรรมดา (ต่างจาก SPFile ซึ่งเป็น Binary) เราสามารถเลือกที่จะ Startup ระบบฯ ด้วยไฟล์พารามิเตอร์ตัวนี้แทน SPFile ได้ เราเรียกไฟล์นี้ว่า Pfile (Parameter File) เป็นไฟล์ลูกพี่ลูกน้องกับ Server Parameter File (SPFile) ซึ่งค่าของพารามิเตอร์ที่กำหนดไว้ภายในอาจจะเหมือนหรือต่างกันก็ได้

และ เนื่องจากการที่เราพยายาม Startup ด้วย SPFile ครั้งล่าสุดทำให้ระบบจำค่าพารามิเตอร์ที่ผิดเอาไว้ เราจึงจะต้องเคลียร์ค่าเหล่านี้โดยปิด Service => ลบหรือเปลี่ยนชื่อของ SPFile (ตัวเก่า) => แล้วเปิด Service ใหม่ => แล้วจึง Startup ระบบฯ ด้วย PFile

SQL> host
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\tanakorn>oradim -shutdown -shuttype srvc -sid orcl10g

C:\Documents and Settings\tanakorn>ren C:\oracle\product\10.2.0\db_1\dbs\spfileorcl10g.ora spfileorcl10g_ori.ora

C:\Documents and Settings\tanakorn>oradim -startup -sid orcl10g

C:\Documents and Settings\tanakorn>exit

SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup pfile='C:\oracle\product\10.2.0\admin\orcl10g\pfile\init.ora.312255320268'
ORACLE instance started.

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 167775108 bytes
Database Buffers 436207616 bytes
Redo Buffers 7135232 bytes
Database mounted.
Database opened.

หลังจากที่เราเปิดระบบฯ ได้แล้ว เราควรจะสร้าง SPFile จาก Pfile ที่เราใช้ในการเปิดระบบฯ เอาไว้ เนื่องจาก SPFile ตัวเก่าใช้ไม่ได้แล้ว เมื่อสร้างเสร็จแล้วให้ Restart ระบบฯ อีกทีเพื่อให้ระบบฯ กลับมาใช้ SPFile อย่างเดิม

การเปิดฐานข้อมูลด้วย SPFile มีประโยชน์ที่เห็นได้ชัดคือทำให้เราสามารถที่จะเปลี่ยนค่าในพารามิเตอร์ได้ โดยสะดวก โดยไม่ต้องไปแก้ไขในเท็กซ์ไฟล์อย่าง PFile

SQL> create spfile from pfile='C:\oracle\product\10.2.0\admin\orcl10g\pfile\init.ora.312255320268';

File created.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 167775108 bytes
Database Buffers 436207616 bytes
Redo Buffers 7135232 bytes
Database mounted.
Database opened.
SQL>

เป็นการเตรียมการที่ดีที่จะสร้าง PFile จาก SPFile ตัวปัจจุบันทุกครั้้ง ก่อนที่จะแก้ไขพารามิเตอร์ที่จะต้องทำการ Restart ระบบฯ เพื่อที่หากเกิดปัญหาจะสามารถนำเอา PFile ตัวนั้นมาใช้ Start ระบบฯได้เลย จากตัวอย่างเราใช้ไฟล์เก่า ซึ่งพารามิเตอร์บางตัวอาจจะไม่เหมือนกับที่ปรากฏใน SPFile ซึ่งอัพเดทกว่าเสมอ

SQL> conn / as sysdba
Connected.
SQL> create pfile from spfile;

File created.

Pfile ที่สร้างขึ้นโดยดีฟอลต์จะไปอยู่ที่ %ORACLE_HOME%\database\ (หรือในกรณีนี้คือ C:\oracle\product\10.2.0\db_1\database\)

Saturday, May 2, 2009

เปิดปิดระบบฐานข้อมุลด้วยสคริปต์

Updated: 8/03/2009

เราสามารถเปิดปิดระบบฐานข้อมูล โดยเขียนเป็นสคริปต์ได้ดังข้างล่าง
สร้างเท็กซ์ไฟล์โดยมีสคริปต์ข้างล่างนี้ แล้วบันทึกเป็นนามสกุล .BAT เพื่อใช้เปิดฐานข้อมูล
set oracle_sid=orcl
oradim -startup -sid orcl
echo startup sqlplus / as sysdba
lsnrctl start

*โดยเปลี่ยน orcl ด้วยชื่อ sid ของคุณ
* oradim เป็นการเปิด Service ของ Oracle บน Windows

ปิดฐานข้อมูล
set oracle_sid=orcl
oradim -shutdown -shuttype srvc -shutmode immediate -sid orcl
rem lsnrctl stop