记得刚入职那会儿,主管扔给我一台服务器账号:"小张啊,以后公司的核心业务系统就交给你维护了,用的是Oracle 10g..." 我表面镇定地点头,内心却在咆哮:"Oracle是啥?10g又是什么鬼?!" 第一次登录SQL*Plus时,连最基本的查询语句都敲得手抖,更别提看到那些复杂的表空间、实例参数了。
现在回想起来,Oracle就像个外表高冷的学霸,熟悉后发现它其实逻辑清晰、功能强大,今天我就把自己这些年摸爬滚打总结的Oracle 10g学习笔记分享给大家,保证比官方文档好啃十倍!
Oracle安装最让人头疼的不是步骤复杂,而是那些隐藏的"坑":
/etc/sysctl.conf
内核参数,特别是shmmax
值(建议设物理内存70%)$ORACLE_BASE
和$ORACLE_HOME
的权限设置错一个,后面能报一堆诡异错误# 典型的环境变量配置(Linux示例) export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export PATH=$PATH:$ORACLE_HOME/bin
别小看这个黑乎乎的命令行工具,高手能用它玩出花:
SET LINESIZE 200
让显示结果不换行COLUMN sal FORMAT $9,999.99
给工资加美元符号和千分位SPOOL /tmp/query_result.log
把查询结果导出到文件-- 实用技巧:用变量避免重复输入 DEFINE emp_id = 7369 SELECT * FROM emp WHERE empno = &emp_id;
刚开始我总把这两个概念搞混,直到前辈用饭店打了个比方:
创建表空间时踩过的雷:
-- 错误示范:忘记指定autoextend CREATE TABLESPACE my_data DATAFILE '/oracle/data/my_data01.dbf' SIZE 100M; -- 正确姿势: CREATE TABLESPACE my_data DATAFILE '/oracle/data/my_data01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
常用监控SQL:
-- 查看表空间使用情况 SELECT tablespace_name, round(used_space/1024/1024,2) "已用空间(MB)", round(tablespace_size/1024/1024,2) "总空间(MB)" FROM dba_tablespace_usage_metrics;
曾经有个查询跑了2小时,加上索引后只要2秒——但第二天ETL作业却挂了,原来:
-- 查看索引使用情况(10g开始有这个视图) SELECT index_name, table_name, used FROM v$object_usage WHERE used='NO'; -- 暴露那些从不使用的索引
第一次看到执行计划时我的表情:😵
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 87 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL | EMPLOYEES| 1 | 87 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
关键看三点:
FULL TABLE SCAN
(全表扫描警告!)Cost
值是不是突然变大Rows
和实际是否差距过大# 全量备份(周末执行) rman target / RMAN> BACKUP DATABASE PLUS ARCHIVELOG; # 增量备份(工作日执行) RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
场景1:误删了重要表
-- 用闪回查询找回数据(10g新特性) SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2025-08-20 14:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE employee_id = 100;
场景2:数据文件损坏
-- 先让文件脱机 ALTER DATABASE DATAFILE '/path/to/file.dbf' OFFLINE; -- 用RMAN恢复 RMAN> RESTORE DATAFILE 5; RMAN> RECOVER DATAFILE 5; -- 最后联机 ALTER DATABASE DATAFILE '/path/to/file.dbf' ONLINE;
生成报告:
-- 先设置快照 EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 等待15分钟后... EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 生成报告 @$ORACLE_HOME/rdbms/admin/awrrpt.sql
报告重点看:
常见需要调整的参数:
-- SGA大小(物理内存的50-60%) ALTER SYSTEM SET sga_max_size=2G SCOPE=SPFILE; -- PGA大小(OLTP系统设SGA的20%) ALTER SYSTEM SET pga_aggregate_target=500M; -- 共享池大小(避免硬解析) ALTER SYSTEM SET shared_pool_size=300M;
ORA-04031错误:共享池不够时,连报错信息自己都申请不到内存(Oracle的自相矛盾时刻)
解决方案:
ALTER SYSTEM FLUSH SHARED_POOL; ALTER SYSTEM SET shared_pool_size=400M SCOPE=BOTH;
临时表空间爆满:开发同事写了个笛卡尔积查询,temp表空间直接撑爆
应急处理:
-- 先加临时文件救急 ALTER TABLESPACE TEMP ADD TEMPFILE '/path/to/temp02.dbf' SIZE 2G; -- 再找出罪魁祸首 SELECT s.sid, s.serial#, s.username, s.sql_id, u.tablespace FROM v$session s, v$tempseg_usage u WHERE s.saddr = u.session_addr;
-- 开启10046跟踪 ALTER SESSION SET tracefile_identifier='my_trace'; ALTER SESSION SET events '10046 trace name context forever, level 12'; -- 执行你的SQL... -- 关闭跟踪 ALTER SESSION SET events '10046 trace name context off';
记得有次系统崩溃,我在机房通宵恢复数据时,保洁阿姨问我:"小伙子,电脑坏了啊?" 我苦笑着点头,心想这可不是普通电脑问题... 现在回头看,学习Oracle的过程就像打游戏升级:
Oracle 10g虽然已经不是最新版本,但它的核心设计思想在后续版本中一脉相承,掌握好这些基础,再学新版本会轻松很多,每个DBA都是从"ORA-00942: 表或视图不存在"这个报错开始成长的——别问我怎么知道的!
本文由 师言文 于2025-08-05发表在【云服务器提供商】,文中图片由(师言文)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/540844.html
发表评论