create-db-10.sql

本文提供了一个用于创建Oracle数据库的详细Shell脚本示例。该脚本定义了数据库的各项配置参数,包括路径设置、文件大小、日志文件及归档等,并通过SQL*Plus执行一系列数据库初始化操作。

from:http://www.db-ora.nl/create-db-10.html

 

create-db-10.sql:

### execute first.
### vi /etc/oratab
### . oraenv
#!/bin/bash

export ORA_BASE=/oracle
export ORA_DATA=/oracle/data
export ORA_FLASH=/oracle/flash

export ORA_ADMIN=$ORA_BASE/admin/$ORACLE_SID
export CHARSET=UTF8
export ORA_ARCH=NOARCHIVELOG
export PASSWD=password

echo "db_domain=''" > init-10.ora
echo "db_name=$ORACLE_SID" >> init-10.ora

echo "background_dump_dest=$ORA_ADMIN/bdump" >> init-10.ora
echo "core_dump_dest=$ORA_ADMIN/cdump" >> init-10.ora
echo "user_dump_dest=$ORA_ADMIN/udump" >> init-10.ora
echo "max_dump_file_size=20M" >> init-10.ora

echo "control_files= ('$ORA_DATA/$ORACLE_SID/control_01.ctl'" >> init-10.ora
echo "                    ,'$ORA_DATA/$ORACLE_SID/control_02.ctl'" >> init-10.ora
echo "                    ,'$ORA_DATA/$ORACLE_SID/control_03.ctl')" >> init-10.ora

echo "db_recovery_file_dest=$ORA_FLASH" >> init-10.ora
echo "db_recovery_file_dest_size=4G" >> init-10.ora

echo "log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST'" >> init-10.ora
echo "log_archive_format='log_%t_%s_%r.arc'" >> init-10.ora

echo "db_create_file_dest=$ORA_DATA" >> init-10.ora

echo "sga_target=350M" >> init-10.ora
echo "log_buffer=1048576" >> init-10.ora

echo "pga_aggregate_target=35M" >> init-10.ora
echo "workarea_size_policy=auto" >> init-10.ora

echo "job_queue_processes=10" >> init-10.ora

echo "db_block_size=8192" >> init-10.ora

echo "open_cursors=300" >> init-10.ora
echo "processes=150" >> init-10.ora

echo "audit_trail=db" >> init-10.ora

echo "remote_login_passwordfile=EXCLUSIVE" >> init-10.ora

echo "dispatchers='(PROTOCOL=TCP)(SERVICE="$ORACLE_SID"XDB)'" >> init-10.ora

echo "undo_management=AUTO" >> init-10.ora
echo "undo_tablespace=UNDOTBS1" >> init-10.ora

# ----------------- Do not modify anything below. --------------------------------------------------

mkdir -p $ORA_ADMIN/bdump $ORA_ADMIN/cdump $ORA_ADMIN/udump
mkdir -p $ORA_ADMIN/adump $ORA_ADMIN/spfile $ORA_ADMIN/pfile
mkdir -p $ORA_DATA/$ORACLE_SID $ORA_FLASH

cp init-10.ora $ORA_ADMIN/pfile/init$ORACLE_SID.ora

orapwd file=$ORA_ADMIN/pfile/orapw$ORACLE_SID password=$PASSWD entries=5
ln -sf $ORA_ADMIN/pfile/orapw$ORACLE_SID $ORACLE_HOME/dbs/orapw$ORACLE_SID

sqlplus /nolog << EOF

spool create-$ORACLE_SID.log

set verify off
DEFINE ORACLE_HOME=$ORACLE_HOME
DEFINE ORACLE_SID=$ORACLE_SID
DEFINE ORA_ADMIN=$ORA_ADMIN
DEFINE ORA_DATA=$ORA_DATA/$ORACLE_SID
DEFINE CHARSET=$CHARSET
DEFINE ORA_ARCH=$ORA_ARCH
DEFINE PASSWD=$PASSWD

connect SYS/&PASSWD as SYSDBA

startup nomount pfile='&ORA_ADMIN/pfile/init&ORACLE_SID/.ora';

create spfile='&ORA_ADMIN/spfile/spfile&ORACLE_SID/.ora'
from pfile='&ORA_ADMIN/pfile/init&ORACLE_SID/.ora';

host ln -sf $ORA_ADMIN/spfile/spfile$ORACLE_SID.ora $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora

CREATE DATABASE &ORACLE_SID
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE '&ORA_DATA/system01.dbf'
SIZE 500M
AUTOEXTEND ON
NEXT 10240K
MAXSIZE 1000M
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '&ORA_DATA/sysaux01.dbf'
SIZE 120M
AUTOEXTEND ON
NEXT 10240K
MAXSIZE 1000M
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE '&ORA_DATA/temp01.dbf'
SIZE 250M
AUTOEXTEND ON
NEXT 5120K
MAXSIZE 2000M
UNDO TABLESPACE UNDOTBS1
DATAFILE '&ORA_DATA/undotbs101.dbf'
SIZE 200M
AUTOEXTEND ON
NEXT 5120K
MAXSIZE 4000M
CHARACTER SET &CHARSET
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('&ORA_DATA/redo01a.log','&ORA_DATA/redo01b.log') SIZE 50M,
GROUP 2 ('&ORA_DATA/redo02a.log','&ORA_DATA/redo02b.log') SIZE 50M,
GROUP 3 ('&ORA_DATA/redo03a.log','&ORA_DATA/redo03b.log') SIZE 50M,
GROUP 4 ('&ORA_DATA/redo04a.log','&ORA_DATA/redo04b.log') SIZE 50M
USER SYS IDENTIFIED BY &PASSWD
USER SYSTEM IDENTIFIED BY &PASSWD
&ORA_ARCH;

@$ORACLE_HOME/rdbms/admin/catalog.sql
@$ORACLE_HOME/rdbms/admin/catblock.sql
@$ORACLE_HOME/rdbms/admin/catproc.sql
@$ORACLE_HOME/rdbms/admin/catoctk.sql
@$ORACLE_HOME/rdbms/admin/owminst.plb
@$ORACLE_HOME/rdbms/admin/catexp.sql
@$ORACLE_HOME/rdbms/admin/dbmspool.sql

alter user sys temporary tablespace temp;
alter user system temporary tablespace temp;

connect system/&PASSWD

@$ORACLE_HOME/sqlplus/admin/pupbld.sql
@$ORACLE_HOME/sqlplus/admin/help/hlpbld.sql helpus.sql

CREATE TABLESPACE USERS
LOGGING
DATAFILE '&ORA_DATA/users01.dbf'
SIZE 25M
AUTOEXTEND ON
NEXT 1280K
MAXSIZE 200M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;

CREATE TABLESPACE TOOLS
LOGGING
DATAFILE '&ORA_DATA/tools01.dbf'
SIZE 100M
AUTOEXTEND ON
NEXT 1280K
MAXSIZE 200M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;

ALTER DATABASE DEFAULT TABLESPACE USERS;

ALTER USER OUTLN ACCOUNT LOCK;
ALTER USER DBSNMP IDENTIFIED BY &PASSWD;

connect sys/&PASSWD as sysdba

@$ORACLE_HOME/javavm/install/initjvm.sql
@$ORACLE_HOME/xdk/admin/initxml.sql
@$ORACLE_HOME/xdk/admin/xmlja.sql
@$ORACLE_HOME/rdbms/admin/catjava.sql
@$ORACLE_HOME/rdbms/admin/catexf.sql

@$ORACLE_HOME/ctx/admin/catctx.sql &PASSWD SYSAUX TEMP NOLOCK
connect CTXSYS/&PASSWD
@$ORACLE_HOME/ctx/admin/defaults/dr0defin.sql AMERICAN

connect sys/&PASSWD as sysdba

@$ORACLE_HOME/rdbms/admin/catqm.sql &PASSWD SYSAUX TEMP
@$ORACLE_HOME/rdbms/admin/catxdbj.sql
@$ORACLE_HOME/rdbms/admin/catrul.sql

@$ORACLE_HOME/ord/admin/ordinst.sql SYSAUX SYSAUX
@$ORACLE_HOME/ord/im/admin/iminst.sql

@$ORACLE_HOME/rdbms/admin/utlrp.sql

spool off

exit

EOF

<think>我们有一个数据库脚本管理的目录结构,其中包含migrations(迁移脚本)、modules(模块脚本)和releases(发布脚本)。 在releases目录中,我们有一个版本脚本(例如2025-11-release-v1.3.sql),它通过包含(@include)其他目录下的具体脚本来汇总一个版本中的所有变更。 但是,我们注意到在示例中,releases脚本使用注释来记录变更,并使用`@include`指令来包含其他脚本文件。 然而,标准的SQL并没有提供`@include`指令。因此,我们需要一种方法来合并这些脚本。 解决方案: 我们可以使用一个构建脚本(例如使用shell脚本、Python脚本等)来解析release文件,根据`@include`指令找到对应的脚本文件,并将它们合并成一个完整的SQL脚本。 步骤如下: 1. 读取release文件(例如2025-11-release-v1.3.sql)。 2. 逐行解析,如果遇到`@include`指令,则提取文件路径。 3. 读取被包含的文件内容,并插入到当前输出中。 4. 对于非`@include`指令的行,可以直接输出(例如注释信息,我们也可以选择保留)。 5. 将所有内容合并成一个新的SQL文件,这个文件就是该版本的完整数据库变更脚本。 注意:在合并时,我们可能需要考虑脚本的执行顺序(按照release文件中的顺序)。 下面是一个简单的Python脚本示例,用于合并这样的release文件: 假设我们的目录结构如上所示,且release文件位于`database/releases`目录下,而包含的脚本可能相对于项目根目录或数据库目录。 我们假设合并脚本运行在`database`目录的同级,因此我们可以使用相对路径。 例如,项目结构: project_root/ database/ ... (如上结构) merge_script.py 在merge_script.py中,我们将处理release文件,并生成合并后的SQL文件。 合并脚本代码(merge_script.py): </think>以下是根据您的需求设计的数据库脚本管理方案,包含目录结构说明、示例代码和实现原理: ### 数据库脚本管理方案实现 ```sql -- 示例:database/releases/2025-11-release-v1.3.sql /* 版本: 2025-11-release-v1.3 描述: 2025年11月版本数据库变更汇总 执行顺序: 从上到下按依赖顺序执行 */ -- ===== 用户模块优化 ===== /* 来源: modules/user_management/2025-11-02_optimize_queries.sql */ \i ../modules/user_management/2025-11-02_optimize_queries.sql -- ===== 订单功能增强 ===== /* 来源: migrations/2025-11-05_enhance_orders.sql */ \include ../migrations/2025-11-05_enhance_orders.sql -- ===== 审计日志扩展 ===== /* 来源: modules/audit/2025-11-10_extend_log.sql */ \ir ../modules/audit/2025-11-10_extend_log.sql ``` ### 目录结构说明 ``` database/ ├── migrations/ # 全局架构变更 │ ├── 2025-10-29_add_user_id_to_order.sql │ ├── 2025-11-05_enhance_orders.sql │ └── ... ├── modules/ # 业务模块脚本 │ ├── user_management/ # 用户管理模块 │ │ ├── init.sql # 模块初始化 │ │ ├── 2025-10-15_add_profile_fields.sql │ │ └── 2025-11-02_optimize_queries.sql │ └── audit/ # 审计模块 │ ├── init.sql │ └── 2025-11-10_extend_log.sql └── releases/ # 版本发布汇总 ├── 2025-10-release-v1.2.sql └── 2025-11-release-v1.3.sql ``` ### 关键实现技术 1. **路径引用语法**: - PostgreSQL: `\i path/to/file.sql` (绝对路径) 或 `\ir relative_path.sql` (相对路径) - MySQL: `SOURCE path/to/file.sql;` - SQL Server: `:r path\to\file.sql` 2. **自动化部署脚本** (Python示例): ```python # deploy_release.py import os import subprocess from pathlib import Path def deploy_release(db_config, release_file): """执行版本发布脚本""" base_path = Path(__file__).parent / "database" release_path = base_path / "releases" / release_file if not release_path.exists(): raise FileNotFoundError(f"Release file not found: {release_path}") # PostgreSQL执行示例 (其他数据库替换相应命令) cmd = [ "psql", f"-h {db_config['host']}", f"-U {db_config['user']}", f"-d {db_config['dbname']}", f"-f {release_path}" ] subprocess.run(" ".join(cmd), shell=True, check=True) # 使用示例 if __name__ == "__main__": db_config = { "host": "localhost", "user": "admin", "dbname": "myapp_prod" } deploy_release(db_config, "2025-11-release-v1.3.sql") ``` ### 方案优势 1. **模块化组织**:按业务功能分离脚本,降低维护复杂度 2. **变更可追溯**:时间戳命名规范保障执行顺序 3. **版本控制友好**: - 迁移脚本独立存储 - Releases目录记录版本快照 - Git提交关联具体变更文件 4. **安全部署**: - 模块初始化脚本(init.sql)保证基础结构 - 增量变更脚本实现渐进式更新 5. **环境一致性**:相同release脚本可在所有环境执行 ### 最佳实践建议 1. **命名规范**:`YYYY-MM-DD_short_description.sql` 2. **原子性变更**:每个脚本完成单一逻辑变更 3. **幂等设计**:所有脚本支持重复执行 ```sql -- 示例:幂等创建表 CREATE TABLE IF NOT EXISTS audit_log ( id SERIAL PRIMARY KEY, action VARCHAR(50) NOT NULL ); ``` 4. **版本控制**:在release文件中记录变更摘要 ```sql -- releases/2025-11-release-v1.3.sql头部 /* [版本] 2025.11-v1.3 [日期] 2025-11-20 [变更概要] 1. 用户查询性能优化 2. 订单金额计算逻辑修正 3. 审计日志增加IP记录 */ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值