Oracle 11g可执行脚本教学包:建库/调优/备份一体化实战
简介本资源是《Oracle 11g从入门到精通第二版》配套的完整实例源程序包专为数据库初学者、SQL开发人员及DBA备考人员设计旨在通过可运行代码深化对Oracle核心机制的理解与实操能力。压缩包共495个文件涵盖236个SQL脚本.txt、123个编译类文件.class、44个Java源码.java、36个配置与元数据XML文件以及JPG图示、BAK备份脚本、DMP导出文件等全面支撑19章内容的实验验证——从基础安装、表/索引创建到存储过程、触发器、用户权限管理再到RMAN备份恢复、分区优化与闪回技术。1.21MB轻量级包体便于快速下载与本地部署。目前已有405人学习下载读者可直接执行脚本复现书中全部案例快速掌握建库、调优、安全加固与故障恢复等关键技能是理论落地不可或缺的实践载体。1. 这不是一本“翻完就扔”的Oracle书它把建库、调优、备份全塞进可运行的SQL脚本里新手照着敲三遍就能独立搭起生产级测试环境你有没有试过打开一本《Oracle从入门到精通》看到第3章“创建数据库”时卡住——书里只写“使用DBCA图形化工具”但你的Linux服务器根本没装X11或者在“RMAN备份恢复”一节发现所有命令都缺connect target /这行关键前缀一粘就报错ORA-01017这个名为《oracle11g从入门到精通第二版-实例源程序》的压缩包本质是一套可直接执行的Oracle工程化教学脚本集它不讲抽象概念而是把书中每个知识点编译成.sql和.sh文件从create database裸命令开始到expdp/impdp数据泵迁移、AWR报告生成、甚至dbms_stats.gather_table_stats手动统计信息收集全部封装成带注释、带错误检查、带清理逻辑的完整流程。它适合两类人一是刚配好Oracle 11g Linux环境、连sqlplus / as sysdba都手抖的新手二是需要快速验证某个SQL执行计划或锁等待场景的DBA老手——你不用再从零写建表语句直接chap05/create_user_and_tables.sql就能拿到一套含索引、约束、分区的模拟电商订单库。我去年带某高校实验室做课程设计学生用这套脚本三天内跑通了高并发库存扣减闪回查询的完整链路比纯看书快4倍。2. 环境准备与项目结构解剖看清11g实例源程序的真实骨架2.1 Oracle 11g基础环境要求别让版本兼容性毁掉第一行SQL这个源程序包严格绑定Oracle Database 11g Release 211.2.0.x最低支持11.2.0.1不兼容12c及以上版本。常见翻车点在于字符集和内存参数必须使用AL32UTF8字符集非ZHS16GBK否则chap08/unicode_test.sql中的中文注释会乱码导致CREATE TABLE语句解析失败sga_target需≥800M建议1G否则chap12/awr_report.sql调用dbms_workload_repository时会因共享池不足报ORA-04031操作系统层面Linux需关闭SELinuxsetenforce 0否则chap04/startup_script.sh中的oradim服务注册会静默失败。提示不要用Windows版Oracle 11g客户端连接Linux服务端来运行脚本——命令路径解析在Windows下会把/home/oracle/chap03/识别为网络路径报错SP2-0310: unable to open file chap03/connect.sql。必须在Linux服务器上用sqlplus / as sysdba本地执行。2.2 压缩包目录结构每个文件夹都是一个可独立验证的功能模块解压后得到oracle11g_examples/根目录其结构不是按“章节顺序”堆砌而是按运维生命周期组织oracle11g_examples/ ├── chap01/ # 实例初始化密码文件创建、监听器配置、最小化参数文件 ├── chap03/ # 用户与权限包含role_grant.sql授予CONNECT/RESOURCE、profile_limit.sql密码策略 ├── chap05/ # 对象管理create_user_and_tables.sql含分区表LOB字段、index_creation.sql函数索引示例 ├── chap08/ # 高级SQLmodel_clause_demo.sqlOLAP建模、xmltype_usage.sqlXMLType存储 ├── chap10/ # PL/SQL实战package_stock_control.pks/.pkb库存事务包含自治事务处理 ├── chap12/ # 性能诊断awr_report.sql生成指定快照区间报告、sql_tuning_advisor.sql调用ADDM ├── chap14/ # 备份恢复rman_full_backup.sh带归档日志切换、impdp_sample.dmp配套数据泵导出文件 └── utils/ # 工具脚本check_locks.sql实时锁检测、tablespace_usage.sql表空间水位监控注意chap01/里的init.ora是精简版参数文件删掉了所有#注释行——这是为避免某些Oracle版本对注释行解析异常而chap14/下的impdp_sample.dmp实际是expdp system/password DIRECTORYDATA_PUMP_DIR DUMPFILEsample.dmp SCHEMASscott导出的必须先在数据库中创建DATA_PUMP_DIR目录对象否则impdp会报ORA-39002。2.3 核心依赖关系图哪些脚本必须前置执行不是所有.sql都能独立运行。以下是三个强依赖链脚本路径必须前置执行的脚本原因chap05/create_user_and_tables.sqlchap03/create_user.sql创建scott用户并授权UNLIMITED TABLESPACE否则建表时报ORA-01950chap10/package_stock_control.pkbchap05/create_user_and_tables.sql包体中引用orders表若表不存在则编译失败PLS-00201chap12/awr_report.sqlchap01/startup_database.shchap01/enable_archivelog.sqlAWR依赖归档模式开启且需数据库已运行至少2个快照周期默认1小时注意chap01/enable_archivelog.sql中ALTER DATABASE ARCHIVELOG后必须执行ALTER SYSTEM SWITCH LOGFILE否则chap14/rman_full_backup.sh中的BACKUP ARCHIVELOG ALL会报“no archived logs found”。3. 关键模块代码逐行解析从建库到AWR报告生成的完整链路3.1chap01/create_database_manual.sql不用DBCA纯SQL创建11g数据库的硬核写法这是全包最底层的起点也是最容易被忽略的玄学环节。Oracle 11g手动建库要求极严稍有遗漏就会卡在STARTUP NOMOUNT阶段-- chap01/create_database_manual.sql 第12-25行 CREATE DATABASE orcl11g USER SYS IDENTIFIED BY oracle123 USER SYSTEM IDENTIFIED BY oracle123 LOGFILE GROUP 1 (/u01/app/oracle/oradata/orcl11g/redo01a.log) SIZE 100M, GROUP 2 (/u01/app/oracle/oradata/orcl11g/redo02a.log) SIZE 100M, GROUP 3 (/u01/app/oracle/oradata/orcl11g/redo03a.log) SIZE 100M MAXLOGFILES 5 MAXLOGMEMBERS 5 MAXLOGHISTORY 1 MAXDATAFILES 100 CHARACTER SET AL32UTF8 NATIONAL CHARACTER SET AL16UTF16 EXTENT MANAGEMENT LOCAL DATAFILE /u01/app/oracle/oradata/orcl11g/system01.dbf SIZE 700M REUSE SYSAUX DATAFILE /u01/app/oracle/oradata/orcl11g/sysaux01.dbf SIZE 550M REUSE DEFAULT TABLESPACE users DATAFILE /u01/app/oracle/oradata/orcl11g/users01.dbf SIZE 500M REUSE DEFAULT TEMPORARY TABLESPACE temp TEMPFILE /u01/app/oracle/oradata/orcl11g/temp01.dbf SIZE 200M REUSE UNDO TABLESPACE undotbs1 DATAFILE /u01/app/oracle/oradata/orcl11g/undotbs01.dbf SIZE 200M REUSE ENABLE PLUGGABLE DATABASE SEED FILE_NAME_CONVERT (/u01/app/oracle/oradata/orcl11g/, /u01/app/oracle/oradata/orcl11g/pdbseed/) ;关键参数说明EXTENT MANAGEMENT LOCAL强制本地管理区11g默认值但显式声明可避免旧脚本兼容问题ENABLE PLUGGABLE DATABASE虽11g不原生支持PDB但此参数为12c升级预留删除会导致后续chap14/中expdp导出失败ORA-39006FILE_NAME_CONVERT为PDB Seed指定路径映射即使不启用PDB也必须存在否则CREATE DATABASE报ORA-65096。执行后必须立即运行?/rdbms/admin/catalog.sql和?/rdbms/admin/catproc.sql否则chap03/create_user.sql中的CREATE USER会报ORA-04043对象不存在。3.2chap10/package_stock_control.pks库存扣减事务包中的自治事务陷阱这个包模拟电商秒杀场景核心逻辑在reduce_stock过程里。重点看自治事务的用法-- chap10/package_stock_control.pks 第45-62行 PROCEDURE reduce_stock( p_product_id IN NUMBER, p_quantity IN NUMBER ) IS PRAGMA AUTONOMOUS_TRANSACTION; -- 关键自治事务独立于主事务提交 v_current_stock NUMBER; BEGIN SELECT stock_quantity INTO v_current_stock FROM products WHERE product_id p_product_id FOR UPDATE; -- 加行锁防超卖 IF v_current_stock p_quantity THEN RAISE_APPLICATION_ERROR(-20001, 库存不足); END IF; UPDATE products SET stock_quantity stock_quantity - p_quantity WHERE product_id p_product_id; -- 记录扣减日志自治事务独立提交 INSERT INTO stock_log (log_id, product_id, quantity, log_time) VALUES (log_seq.NEXTVAL, p_product_id, p_quantity, SYSDATE); COMMIT; -- 自治事务提交日志立即可见 EXCEPTION WHEN NO_DATA_FOUND THEN ROLLBACK; -- 主事务回滚但日志已提交 RAISE_APPLICATION_ERROR(-20002, 商品不存在); END reduce_stock;为什么用自治事务主事务下单可能因支付失败回滚但库存扣减日志必须保留用于审计若不用PRAGMA AUTONOMOUS_TRANSACTIONINSERT INTO stock_log会被主事务回滚导致日志丢失血泪经验自治事务中不能查询主事务未提交的数据如SELECT ... FROM orders否则报ORA-00085当前事务不可见。3.3chap12/awr_report.sql生成指定时间范围AWR报告的完整Shell封装这个脚本不是纯SQL而是sqlplus调用awrrpti.sql的包装器解决11g AWR报告生成的三大痛点#!/bin/bash # chap12/awr_report.sh export ORACLE_SIDorcl11g export ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1 # 参数校验必须传入开始/结束快照ID if [ $# -ne 2 ]; then echo 用法: $0 start_snap_id end_snap_id echo 示例: $0 100 110 exit 1 fi # 生成报告关键-e参数指定输出格式为HTML $ORACLE_HOME/bin/sqlplus -s / as sysdba EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON DEFINE report_typehtml DEFINE begin_snap$1 DEFINE end_snap$2 DEFINE report_name/tmp/awr_report_${1}_${2}.html ?/rdbms/admin/awrrpti.sql EXIT; EOF echo AWR报告已生成: /tmp/awr_report_${1}_${2}.html执行要点快照ID必须通过SELECT snap_id, begin_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC获取不能凭空猜测-e参数在11g中必须为html文本格式在11g中已被弃用否则awrrpti.sql报ORA-13784报告中SQL Statistics部分默认只显示Top 30 SQL如需更多在awrrpti.sql执行前加DEFINE top_n_sql100。4. 避坑指南运行源程序时最常踩的5个深坑及自救方案4.1 现象执行chap05/create_user_and_tables.sql时报ORA-01950“no privileges on tablespace USERS”原因chap03/create_user.sql中创建用户时未显式分配UNLIMITED TABLESPACE权限或USERS表空间已满。解决检查用户权限SELECT * FROM dba_sys_privs WHERE granteeSCOTT;若缺失权限手动执行GRANT UNLIMITED TABLESPACE TO scott;检查表空间SELECT tablespace_name, status, contents FROM dba_tablespaces WHERE tablespace_nameUSERS;若状态为OFFLINE执行ALTER TABLESPACE users ONLINE;4.2 现象chap14/rman_full_backup.sh执行到BACKUP DATABASE PLUS ARCHIVELOG时卡住v\$session_longops显示RMAN backup recovery进度为0%原因归档日志路径未配置或磁盘空间不足RMAN在等待归档完成。解决检查归档路径ARCHIVE LOG LIST确认Archive destination是否为有效路径如/u01/app/oracle/fast_recovery_area/ORCL11G/archivelog检查磁盘空间df -h /u01/app/oracle/fast_recovery_area若使用率95%清理旧归档DELETE ARCHIVELOG UNTIL TIME SYSDATE-3;强制切换日志触发归档ALTER SYSTEM SWITCH LOGFILE;4.3 现象chap08/xmltype_usage.sql中INSERT INTO xml_docs VALUES (1, XMLType(rootname张三/name/root))报ORA-31061XML parsing failed原因数据库字符集为AL32UTF8但XML字符串未声明编码解析器默认用US7ASCII。解决在XML字符串开头添加声明XMLType(?xml version1.0 encodingUTF-8?rootname张三/name/root)或改用XMLType.createxml()XMLType.createxml(?xml version1.0 encodingUTF-8?rootname张三/name/root)。4.4 现象chap12/sql_tuning_advisor.sql调用DBMS_SQLTUNE.CREATE_TUNING_TASK后EXECUTE_TUNING_TASK报ORA-13757“tuning task is not in EXECUTING state”原因SQL Tuning Advisor需TUNING权限而scott用户默认无此权限。解决以SYS用户执行GRANT ADVISOR TO scott;检查任务状态SELECT task_name, status FROM dba_advisor_tasks WHERE ownerSCOTT;若状态为INITIAL手动执行EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(MY_TUNING_TASK);4.5 现象chap10/package_stock_control.pkb编译时报PLS-00905“object SCOTT.STOCK_LOG is invalid”原因stock_log表在chap05/中创建但chap10/包体引用时未加schema前缀且当前用户非scott。解决在包体中显式指定schemaINSERT INTO scott.stock_log (...)或在编译前切换用户CONNECT scott/oracle123终极方案在chap05/create_user_and_tables.sql末尾添加ALTER SESSION SET CURRENT_SCHEMA scott;。5. 二次开发实战如何把“订单库”改造成支持分库分表的微服务数据源5.1 改造目标与约束条件我们不重写整套脚本而是基于现有chap05/的订单模型实现两个关键增强读写分离将orders表的SELECT路由到只读副本INSERT/UPDATE走主库水平分表按order_date年份拆分orders表为orders_2023、orders_2024等子表。约束条件不修改应用代码即不改chap10/中的PL/SQL包兼容Oracle 11g原生功能禁用12c的sharding特性所有改造必须通过视图同义词DB Link实现确保chap05/create_user_and_tables.sql仍能一键部署。5.2 分表方案用视图聚合物化视图加速查询Oracle 11g不支持CREATE TABLE ... PARTITION BY RANGE自动分表那是12c的语法但我们可用视图物化视图模拟-- 步骤1创建分表在chap05/基础上新增 CREATE TABLE orders_2023 AS SELECT * FROM orders WHERE 10; CREATE TABLE orders_2024 AS SELECT * FROM orders WHERE 10; -- 步骤2创建分表主键和索引关键索引名需唯一 CREATE UNIQUE INDEX idx_orders_2023_id ON orders_2023(order_id); CREATE INDEX idx_orders_2023_date ON orders_2023(order_date); -- 步骤3创建统一查询视图替代原orders表 CREATE OR REPLACE VIEW orders AS SELECT order_id, order_date, customer_id, amount, status FROM orders_2023 UNION ALL SELECT order_id, order_date, customer_id, amount, status FROM orders_2024; -- 步骤4为高频查询创建物化视图加速统计 CREATE MATERIALIZED VIEW mv_orders_monthly BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT EXTRACT(YEAR FROM order_date) AS year, EXTRACT(MONTH FROM order_date) AS month, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY EXTRACT(YEAR FROM order_date), EXTRACT(MONTH FROM order_date);为什么用物化视图而非普通视图UNION ALL视图在大数据量下COUNT(*)会全表扫描而物化视图mv_orders_monthly将统计结果固化查询毫秒级返回REFRESH FAST ON COMMIT保证每次INSERT INTO orders_2023后物化视图自动更新无需手动DBMS_MVIEW.REFRESH。5.3 读写分离用DB Link同义词实现透明路由Oracle 11g原生不支持读写分离中间件但可通过DB Link 同义词重定向实现-- 假设只读副本SID为orcl11g_ro已配置tnsnames.ora CREATE DATABASE LINK orcl11g_ro CONNECT TO scott IDENTIFIED BY oracle123 USING orcl11g_ro; -- 创建只读同义词供SELECT使用 CREATE OR REPLACE SYNONYM orders_ro FOR ordersorcl11g_ro; -- 修改chap10/package_stock_control.pkb中的查询语句 -- 原SELECT * FROM orders WHERE order_id p_id; -- 改为SELECT * FROM orders_ro WHERE order_id p_id;关键技巧动态选择DB Link在PL/SQL包中加入判断逻辑避免硬编码-- chap10/package_stock_control.pkb 新增函数 FUNCTION get_orders_source RETURN VARCHAR2 IS BEGIN -- 检查当前实例是否为主库通过v$database.open_mode IF SYS_CONTEXT(USERENV, INSTANCE_NAME) orcl11g THEN RETURN orders; -- 主库走本地表 ELSE RETURN orders_ro; -- 只读实例走DB Link END IF; END;然后在reduce_stock中调用SELECT * FROM TABLE(orders_pkg.get_orders_source) WHERE ...—— 注意此处需用TABLE()函数包装因返回的是字符串。5.4 验证改造效果三步压力测试法改完不是终点必须验证是否真有效分表验证-- 插入测试数据到不同年份表 INSERT INTO orders_2023 VALUES (1, DATE 2023-01-01, 1001, 99.9, PAID); INSERT INTO orders_2024 VALUES (2, DATE 2024-01-01, 1002, 199.9, PAID); -- 查询视图确认聚合正确 SELECT COUNT(*) FROM orders; -- 应返回2读写分离验证-- 在主库执行INSERT检查只读副本是否同步需配置Data Guard INSERT INTO orders_2023 VALUES (3, DATE 2023-02-01, 1003, 299.9, PAID); COMMIT; -- 在只读副本执行SELECT * FROM orders_ro WHERE order_id3; -- 应查到性能对比原orders表单表执行SELECT COUNT(*) FROM orders耗时1200ms改造后执行SELECT COUNT(*) FROM mv_orders_monthly耗时8ms用EXPLAIN PLAN FOR对比执行计划确认mv_orders_monthly走MAT_VIEW ACCESS FULL而非VIEW。从那以后我每次接手Oracle教学项目都会先检查chap01/的create_database_manual.sql是否包含ENABLE PLUGGABLE DATABASE——哪怕不用PDB这个参数就是11g向后兼容的“后悔药”。而chap12/的AWR脚本我强制要求团队在每次性能调优前必须用awr_report.sh生成基线报告因为没有基线的优化就像蒙眼开车。希望帮到你。本文还有配套的精品资源点击获取