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)

No comments:

Post a Comment