手工創建數據庫是DBA核心技能,也是理解實例架構、參數文件、控制文件、重做日誌、表空間、數據字典依賴關係的最佳途徑。本文提供可直接執行的標準化腳本流程:確定SID/DB_NAME → 認證方式 → 創建PFILE/SPFILE → 啟動NOMOUNT實例 → CREATE DATABASE → 創建附加表空間 → 運行數據字典腳本 → 驗收檢查,含關鍵參數模板與常見報錯對策。
oracle、組oinstall/dba、目錄/u01/app/oracle、/u02/oradata已就緒。ORACLE_BASE、ORACLE_HOME、PATH、LD_LIBRARY_PATH。export ORACLE_SID=MYNEWDB
export DB_NAME=MYNEWDB
本例採用操作系統認證 (OS Authentication):
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE (後續創建密碼文件)
OS用戶oracle屬於dba組,可CONNECT / AS SYSDBA。
$ cat > $ORACLE_HOME/dbs/initMYNEWDB.ora <<'EOF'
*.db_name='MYNEWDB'
*.db_domain=''
*.control_files=('/u02/oradata/MYNEWDB/control01.ctl','/u02/oradata/MYNEWDB/control02.ctl','/u02/oradata/MYNEWDB/control03.ctl')
*.memory_target=1G
*.processes=300
*.sessions=335
*.open_cursors=300
*.pga_aggregate_target=256M
*.sga_target=768M
*.diagnostic_dest='/u01/app/oracle'
*.audit_file_dest='/u01/app/oracle/admin/MYNEWDB/adump'
*.audit_trail='DB'
*.compatible='19.0.0'
*.db_block_size=8192
*.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
EOF
# 啟動NOMOUNT實例並創建SPFILE
sqlplus / as sysdba <
sqlplus / as sysdba <<'EOF'
CREATE DATABASE MYNEWDB
USER SYS IDENTIFIED BY "SysPassword#2024"
USER SYSTEM IDENTIFIED BY "SystemPassword#2024"
LOGFILE GROUP 1 ('/u02/oradata/MYNEWDB/redo01a.log','/u02/oradata/MYNEWDB/redo01b.log') SIZE 200M BLOCKSIZE 512,
GROUP 2 ('/u02/oradata/MYNEWDB/redo02a.log','/u02/oradata/MYNEWDB/redo02b.log') SIZE 200M BLOCKSIZE 512,
GROUP 3 ('/u02/oradata/MYNEWDB/redo03a.log','/u02/oradata/MYNEWDB/redo03b.log') SIZE 200M BLOCKSIZE 512
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXLOGHISTORY 1000
MAXDATAFILES 1024
MAXINSTANCES 8
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE '/u02/oradata/MYNEWDB/system01.dbf' SIZE 700M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
SYSAUX DATAFILE '/u02/oradata/MYNEWDB/sysaux01.dbf' SIZE 550M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
DEFAULT TABLESPACE users
DATAFILE '/u02/oradata/MYNEWDB/users01.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
DEFAULT TEMPORARY TABLESPACE temp
TEMPFILE '/u02/oradata/MYNEWDB/temp01.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
UNDO TABLESPACE undotbs1
DATAFILE '/u02/oradata/MYNEWDB/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
EOF
sqlplus / as sysdba <<'EOF'
-- 應用表空間
CREATE TABLESPACE app_data DATAFILE '/u02/oradata/MYNEWDB/app_data01.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE app_index DATAFILE '/u02/oradata/MYNEWDB/app_idx01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE 5G EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
-- 大對象表空間
CREATE TABLESPACE lob_data DATAFILE '/u02/oradata/MYNEWDB/lob01.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
-- 唯讀/歸檔表空間 (可選)
CREATE TABLESPACE archive_data DATAFILE '/u02/oradata/MYNEWDB/archive01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 1G EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
EOF
sqlplus / as sysdba <<'EOF'
@$ORACLE_HOME/rdbms/admin/catalog.sql
@$ORACLE_HOME/rdbms/admin/catproc.sql
-- 12c+ 還需
@$ORACLE_HOME/rdbms/admin/catcdb.sql
-- 安裝OWM/APEX/ORDS等組件按需運行相應腳本
EOF
注意:catalog.sql 創建標準視圖、同義詞、PL/SQL包;catproc.sql 創建內建包體;耗時5-30分鐘視硬件而定。
sqlplus / as sysdba <<'EOF'
CREATE USER app_user IDENTIFIED BY "AppPass#2024"
DEFAULT TABLESPACE app_data TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data QUOTA UNLIMITED ON app_index;
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE PROCEDURE, CREATE VIEW, CREATE TRIGGER TO app_user;
GRANT SELECT ON v_$session TO app_user; -- 監控需要
EOF
cat > $ORACLE_HOME/network/admin/listener.ora <<'EOF'
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = $(hostname))(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = MYNEWDB)
(ORACLE_HOME = $ORACLE_HOME)
(SID_NAME = MYNEWDB)
)
)
EOF
lsnrctl start
sqlplus / as sysdba <<'EOF'
ALTER SYSTEM REGISTER;
EOF
| 檢查項 | 命令/方法 | 預期結果 |
|---|---|---|
| 實例狀態 | SELECT status FROM v$instance; | OPEN |
| 字符集 | SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%'; | AL32UTF8 / AL16UTF16 |
| 控制文件 | SELECT name FROM v$controlfile; | 3個文件存在 |
| 重做日誌 | SELECT group#, bytes/1024/1024 MB FROM v$log; | 3組,各200MB |
| 表空間 | SELECT tablespace_name, contents FROM dba_tablespaces; | SYSTEM, SYSAUX, UNDO, TEMP, USERS, APP_*, LOB_* |
| 數據字典 | SELECT COUNT(*) FROM dba_objects WHERE owner IN ('SYS','SYSTEM'); | > 50,000 |
| 遠程連接 | 客戶端 tnsping MYNEWDB / sqlplus app_user@MYNEWDB | 成功 |
| 備份模式 | SELECT log_mode FROM v$database; | ARCHIVELOG (需後續啟用) |
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-01078: failure in processing system parameters | PFILE參數語法錯/路徑不存在 | 檢查control_files、diagnostic_dest目錄權限 |
| ORA-01501: CREATE DATABASE failed | 文件已存在/磁盤空間不足/權限 | 確認/u02/oradata/MYNEWDB空目錄、oracle用戶寫權限 |
| ORA-00200: control file could not be created | 控制文件路徑目錄不存在 | 預先mkdir -p所有目錄 |
| ORA-01119: error in creating database file | 文件系統不支援AUTOEXTEND/配額 | 檢查文件系統類型、磁盤配額 |
| catalog.sql運行極慢/卡住 | 統計信息收集、並行度、UNDO不足 | 增加UNDO_TABLESPACE大小、設置PARALLEL_MAX_SERVERS |
手工建庫雖繁瑣,但每一步都映射到實例核心結構。建議將上述流程封裝為create_db.sh參數化腳本,納入版本控制,實現「基礎設施即代碼」。