简介
- 在线演示环境
- 注:本文中 aezo/aezo 一般指用户名/密码,local_orcl 指配置的本地数据库服务名,remote_orcl 指配置的远程数据库服务名。以 11g 为例
- 安装oracle 11.2g参考印象笔记(测试通过)
- 需要注意数据文件目录(/u01/app/oracle/oradata)挂载的磁盘,建议将
/u01
目录挂载到单独的数据盘上
- 需要注意数据文件目录(/u01/app/oracle/oradata)挂载的磁盘,建议将
Oracle相关名词和原理
- 数据库名(db_name)、实例名(instance_name)、以及操作系统环境变量(oracle_sid) ^1
db_name
: 在每一个运行的 oracle 数据库中都有一个数据库名(如: orcl),如果一个服务器程序中创建了两个数据库,则有两个数据库名。instance_name
: 数据库实例名则用于和操作系统之间的联系,用于对外部连接时使用。在操作系统中要取得与数据库之间的交互,必须使用数据库实例名(如: orcl)。与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。例如,要和某一个数据库 server 连接,就必须知道其数据库实例名,只知道数据库名是没有用的。用户和实例相连接。oracle_sid
: 有时候简称为 SID。在实际中,对于数据库实例名的描述有时使用实例名(instance_name)参数,有时使用 ORACLE_SID 参数。这两个都是数据库实例名。instance_name 参数是 ORACLE 数据库的参数,此参数可以在参数文件中查询到,而 ORACLE_SID 参数则是操作系统环境变量,用于和操作系统交互,也就是说在操作系统中要想得到实例名就必须使用 ORACLE_SID。此参数与 ORACLE_BASE、ORACLE_HOME
等用法相同。在数据库安装之后,ORACLE_SID 被用于定义数据库参数文件的名称。如:$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。
service_name
- 是网络服务名(如:local_orcl),可以随意设置,相当于某个数据库实例的别名方便记忆和访问。
tnsnames.ora
文件中设置的名称(如:local_orcl=(...)
),也是登录 pl/sql 是填写的 Database
- 是网络服务名(如:local_orcl),可以随意设置,相当于某个数据库实例的别名方便记忆和访问。
schema
- schema 为数据库对象的集合,为了区分各个集合,需要给这个集合起个名字,这些名字就是我们看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个 schema。schema 里面包含了各种对象如 tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。一个用户一般对应一个 schema,该用户的 schema 名等于用户名,并作为该用户缺省 schema
listener.ora
服务端监听实例列表和端口(1521)配置tnsnames.ora
连接监听的别名test_orcl(127.0.0.1 1521 orcl)pfile
和spfile
参数文件- 参考:https://www.cnblogs.com/xqzt/p/4832597.html
- pfile:初始化参数文件(Initialization Parameters Files)
- 默认路径为:/u01/app/oracle/product/11.2.0/dbs/<init+例程名.ora>
- ASCII文本文件,可vi修改
- spfile:服务器参数文件(Server Parameter Files)
- 默认路径为:/u01/app/oracle/product/11.2.0/dbs/<spfile+例程名.ora>
- 二进制文件,只能连接数据库后通过命令修改
- 查看spfile未知
show parameter spfile
- startup 启动次序 spfile优先于pfile。查找文件的顺序是 spfileSID.ora-〉spfile.ora-〉initSID.ora-〉init.ora(spfile优先于pfile)
- 判断实例是pfile还是spfile启动
select decode(count(*),1,'spfile','pfile') from v$spparameter where rownum=1 and isspecified ='TRUE';
- 以pfile启动如
startup pfile='/u01/app/oracle/product/11.2.0/dbs/initorcl.ora'
(一般位于 $ORACLE_HOME/dbs/init{SID}.ora)- 安装数据库时的初始化模板文件
/u01/app/oracle/admin/orcl/pfile/init.ora.2172017164927
- 安装数据库时的初始化模板文件
- 判断实例是pfile还是spfile启动
- pfile和spfile的互相创建
- create spfile[=’xxxxx’] from pfile[=’xxxx’];
- create pfile[=’xxxxx’] from spfile[=’xxxx’];
- spfile参数的三种scope
- scope=spfile: 对参数的修改记录在服务器初始化参数文件中,修改后的参数在下次启动DB时生效。适用于动态和静态初始化参数
- scope=memory: 对参数的修改记录在內存中,对于动态初始化参数的修改立即生效。在重启DB后会丟失
- scope=both: 对参数的修改会同时记录在服务器参数文件和內存中,对于动态参数立即生效,对静态参数不能用这个选项
启动/停止
- 监听程序(重启数据库可不用重启监听程序)
1 | ## 启动监听程序(shell命令行运行即可) |
- 重启数据库
1 | ## 重启服务 |
- startup 说明
1 | -- 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库。读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件 |
常用操作
- sql 命令行中执行 bash 命令加
!
,如!ls
查看目录
系统相关
管理员登录
- sqlplus 本地登录:
sqlplus / as sysdba
,以 sys 登录。sys 为系统管理员,拥有最高权限;system 为本地管理员,次高权限 - sqlplus 远程登录:
sqlplus aezo/aezo@192.168.1.1:1521/orcl
(orcl 为远程服务名),失败可尝试如下命令:sqlplus /nolog
connect aezo/aezo@192.168.1.1:1521/orcl;
,或者使用配置好的服务名连接conn aezo/aezo@remote_orcl
- pl/slq 管理员登录:用户名密码留空,Connect as 选择 SYSDBA 则默认以 sys 登录。登录远程只需要在 tnsnames.ora 进行网络配置即可
执行脚本
- plsql 打开命令行窗口,执行 sql 文件:
start D:\sql\my.sql
或@ D:/sql/my.sql
(部分语句需要执行commit
提交,建议 start) - bat 脚本(data.bat):
sqlplus user/password@serverip/database @"%cd%\data.sql"
(data.sql 和 data.bat 同级,此处只能用@) - 后台运行脚本
nohup bash run.sh > run.log 2>&1 &
1 | # 下面的文件都不要加空行 |
数据库相关
连接/进程数
1 | -- 查询数据库当前连接数 |
表空间
- 表空间不足/扩容参考下文
- oracle 和 mysql 不同,创建表空间相当于 mysql 的创建数据库。创建了表空间并没有创建数据库实例 ^2
- oracle自带表空间:SYSTEM、SYSAUX、TEMP、UNDO、USERS
1 | sqlplus / as sysdba |
锁表
1 | -- 查询被锁表的信息(多刷新几次,应用可能会临时锁表) |
索引
- 索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表 ^4
- 进行索引操作建议在无其他链接的情况下,或无响应写操作的情况下,数据量越大创建索引越耗时
- Oracle 在创建时会做相应操作,因此创建后就会看到效果,无需重启服务
- 索引是全局唯一的
创建索引语法
1
2
3
4
5
6
7
8
9CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique表示唯一索引(index_name全局唯一)
ON table_name([column1 [ASC|DESC],column2 --bitmap,创建位图索引
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1] --指定索引在数据块中空闲空间
[STORAGE (INITIAL n2)]
[NOLOGGING] --表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
[NOLINE]
[NOSORT]; --表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用create、rebuild 对大表进行索引操作时切记加上
online
参数,此时 DDL 与 DML 语句可以并行运行,防止阻塞. ^11
1 | -- 创建索引 |
用户相关
用户基本操作
- 基本操作
1 | -- 查看所有用户 |
- 授权
1 | -- 授予 samlle 用户创建 session 的权限,即登陆权限 |
- 创建 dba 账户
1 | create user smalle identified by smalle default tablespace aezocn; |
- 密码过期(ORA-28001)
- 重新设置密码即可
alter user aezo identified by aezo;
- 设置永久不过期
alter profile default limit password_life_time unlimited;
- 重新设置密码即可
- 解锁用户(无需重启 oracle 服务)
1 | alter user scott account unlock; -- 新建数据库scott默认未解锁 |
创建只读用户
1 | -- 12c开始,在CDB容器中创建用户,用户名需要以`c##`前缀开头 |
权限其他
- 同一DB,USER1使用USER2的表创建视图,容易报无权限(尽管将USER1设置成功了DBA,且将相关表设置了别名)
- 解决办法:通过USER2执行
GRANT SELECT ANY TABLE TO USER1;
之后再创建视图
- 解决办法:通过USER2执行
sqlplus 使用技巧
- sqlplus 执行 PL/SQL 语句,再输入完语句后回车一行输入
/
set line 1000;
可适当调整没行显示的宽度(适当美化)- 永久修改显示行跨度,修改
glogin.sql
文件,如/usr/lib/oracle/11.2/client64/lib/glogin.sql
,末尾添加set line 1000;
set linesize 10000;
– 设置整行长度,linesize 说明 https://blog.csdn.net/u012127798/article/details/34146143col username for a20
– 设置username这个字段的列宽为20个字符
- 永久修改显示行跨度,修改
set serverout on;
开启输出- 否则执行
begin dbms_output.put_line('hello world!'); end;
无法输出
- 否则执行
set autotrace on
后面运行的 sql 会自动进跟踪统计- 删除字符变成
^H
解决办法:添加stty erase ^H
到~/.bash_profile
,或者按住Shift进行删除 show errors;
查看编译错误- 导入sql文件等,创建存储过程需要输入
/
进行执行;如果文件中有多个存储过程应该在文件的每个存储过程结束后增加/
查询相关
系统
- 查看服务是否启动:
tnsping local_orcl
cmd 直接运行- 远程查看(cmd 运行):
tnsping 192.168.1.1:1521/orcl
、或者tnsping remote_orcl
(其中 remote_orcl 已经在本地建立好了监听映射,如配置在 tnsnames.ora) - 如果能够 ping 通,则说明客户端能解析 listener 的机器名,而且 lister 也已经启动,但是并不能说明数据库已经打开,而且 tsnping 的过程与真正客户端连接的过程也不一致。但是如果不能用 tnsping 通,则肯定连接不到数据库
- 实例 tnsping 突然高达 1w 多毫秒,如
listener.log
(/u01/oracle/diag/tnslsnr/oracle/listener)日志文件过大,可重新创建一个此日志文件. ^10
- 远程查看(cmd 运行):
- 查看表空间数据文件位置:
select file_name, tablespace_name from dba_data_files;
查询数据库字符集
- 查看oracle服务端编码:select * from sys.nls_database_parameters;
select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
(如AL32UTF8
)- 查看服务器语言和字符集
select userenv('language') from dual;
如:AMERICAN_AMERICA.AL32UTF8
、SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- 格式为
language_territory.charset
:Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集 - 出现过linux运行是AMERICAN_AMERICA.AL32UTF8,windows运行是SIMPLIFIED CHINESE_CHINA.AL32UTF8
- 格式为
- 查看client编码:select * from sys.nls_session_parameters;
- 在windows平台下,就是注册表里面
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1\NLS_LANG
- PL/SQL则看环境变量
NLS_LANG
- 在windows平台下,就是注册表里面
- 查询dmp文件的字符集
- 用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集
select nls_charset_name(to_number('0354','xxxx')) from dual;
结果是ZHS16GBK
参考(修改字符集):http://blog.itpub.net/29863023/viewspace-1331078/
修改服务端编码(在oracle 11g上通过测试)
1
2
3
4
5
6
7
8
9SQL> sqlplus / as sysdba;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter system enable restricted session;
SQL> alter system set job_queue_processes=0;
SQL> alter database open;
SQL> alter database character set internal_use ZHS16GBK; # 这里为你所要转换成的字符集,跳过超子集检测
SQL> shutdown immediate;
SQL> startup修改客户端编码
- 运行regedit命令,在注册表中找到这个下的键HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG,将其值改为上述服务器端你所修改的字符编码值
- 点击我的电脑右键》属性》高级》环境变量》新建一个用户变量:NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- 查看oracle服务端编码:select * from sys.nls_database_parameters;
- 查看服务是否启动:
- 用户相关查询
- 查看当前用户默认表空间:
select username, default_tablespace from user_users;
(以 dba 登录则结果为 SYS 和 SYSTEM)。user_users 换成 dba_users 则是查询所有用户默认表空间 - 查看当前用户角色:
select * from user_role_privs;
- 查看当前用户系统权限:
select * from user_sys_privs;
- 查看当前用户表级权限:
select * from user_tab_privs;
- 查看用户下所有表:
select * from user_tables;
- DBA 相关查询见数据库字典
- 查看当前用户默认表空间:
- 数据字典 ^5
user_
:记录用户对象的信息,如 user_tables 包含用户创建的所有表,user_views,user_constraints 等all_
:记录用户对象的信息及被授权访问的对象信息dba_
:记录数据库实例的所有对象的信息,如 dba_users 包含数据库实例中所有用户的信息。dba 的信息包含 user 和 all 的信息。大部分是视图v$
:当前实例的动态视图,包含系统管理和优化使用的视图。等价于v_$
gv_
:分布环境下所有实例的动态视图,包含系统管理和优化使用的视图,这里的 gv 表示 global v\$的意思
- 基本数据字典
- 常用
dict
构成数据字典的所有表的信息dba_users
所有的用户信息(oracle 密码是加密的,忘记密码只能修改)dba_tables
所有用户的所有表的信息dba_tablespaces
记录系统表空间的基本信息;dba_data_files
记录系统数据文件及表空间的基本信息;dba_free_space
记录系统表空间的剩余空间的信息;
- 其他
cat
当前用户可以访问的所有的基表tab
当前用户创建的所有基表,视图,同义词等dba_views
所有用户的所有视图信息dba_constraints
所有用户的表约束信息dba_indexes
所有用户索引的简要信息dba_ind_columns
所有用户索引的列信息dba_triggers
所有用户触发器信息dba_source
所有用户存储过程源代码信息dba_procedus
所有用户存储过程dba_segments
所有用户段(表,索引,cluster)使用空间信息dba_tab_columns
所有用户的表的列(字段)信息dba_synonyms
所有用户同义词信息dba_sequences
所有用户序列信息dba_extents
所有用户段的扩展段信息dba_objects
所有用户对象的基本信息(包括素引,表,视图,序列等)
- 常用
数据库组件相关的数据字典(
v$
代表视图,等价于v_$
)- 基本
v$database
同义词 v_\$database,记录系统的运行情况v$instance
实例信息v$parameter
记录系统各参数的基本信息v$sql
列举了共享 SQL 区(Shared SQL Area)中的 SQL 统计信息,这个视图中的信息未经分组,每个 SQL 指针都包含一条独立的记录v$sqlarea
列出了共享 SQL 区(Shared SQL Area)中的 SQL 统计信息,根据 SQL_TEXT 进行的一次汇总统计(对 SQL_TEXT 进行 group by)v$sqltext
- 相关文件
v$controlfile
控制文件信息v$datafile
数据文件信息v$logfile
日志文件(redo)v$tempfile
临时文件v$diag_info
日志目录(alert/trace)v$controlfile_record_section
记录系统控制运行的基本信息v$filestat
记录数据文件读写的基本信息
举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36-- 以下4种文件默认都在安装目录的oradata下,如C:/soft/oracle/oradata/orcl
select name from v$datafile; -- 数据文件信息
select name from v$controlfile; -- 控制文件
select * from v$logfile; -- (redo)日志文件
select * from v$tempfile; -- 临时文件
-- (alert/trace) 日志目录
select * from v$diag_info;
-- v$sql 和 v$sqlarea 的区别:https://blog.51cto.com/gldbhome/1166576。字段详细说明:http://blog.itpub.net/31397003/viewspace-2142838/
-- v$sql的hash_value:基于(sql)语句实际的物理对象来计算,如两个用户的同一表名,查询sql语句一样,物理对象却是两个,因此在v$sql中有两条记录,但是两个用户多次查询,只会在各自的记录上进行统计executions
-- v$sqlarea的hash_value:仅仅基于sql_text进行合并计算,上述情况将只有一条记录,两个用户多次查询只会在这条记录上进行累计
/*
sql_id 缓存在高速缓冲区(library cache)中的SQL父游标的唯一标识ID
sql_text 当前sql指针的前1000个字符
sql_fulltext 完整的sql(clob)
executions 执行次数
disk_reads 这个子指针disk read(物理读)的次数
buffer_gets 这个子指针的buffer gets(缓存读)数量
optimizer_mode sql执行的优化器模式:ALL_ROWS、CHOOSE
optimizer_cost sql执行成本
cpu_time 消耗CPU时间(us微秒=1/1000000s)
elapsed_time 公式:elapsed_time(响应时间) = cpu_time(服务计算时间) + wait_time(等待时间),如果是多线程,有可能 cpu_time > elapsed_time
last_load_time 最近执行时间点(24h制)
hash_value 在library cache中父指针的hash value值
*/
select sql_text,executions,disk_reads,optimizer_mode,buffer_gets,hash_value from v$sql where sql_text='select count(*) from emp';
/*
sql_text 当前指针的前1000个字符
version_count 在cache中这个父指针下存在的子指针的数量
executions 总的执行次数,包含所有子指针执行次数的汇总
disk_reads 所有子指针的disk reads总和
buffer_gets 所有子指针的buffer gets总和
optimizer_mode sql执行的优化器模
hash_value 父指针的hash value
*/
select sql_text,executions,disk_reads,buffer_gets,hash_value,version_count from v$sqlarea where sql_text='select count(*) from emp';
- 基本
表信息和字段信息
1 | -- 查询所有数据库(需要一定权限):由于Oralce没有库名,只有表空间,所以Oracle没有提供数据库名称查询支持,只提供了表空间名称查询。 |
日志文件
- oracle 的日志文件有几种
alert警告日志
- 在 10g 版本系统初始化参数文件设置的
show parameter background_dump_dest
对应的就是它的位置 - 在 11g 以及 ORACLE 12c 中告警日志文件目录
select * from v$diag_info;
(11g 以上主要是因为引入了 ADR:Automatic Diagnostic Repository 一个存放数据库 alert 日志、trace 日志目录)
- 在 10g 版本系统初始化参数文件设置的
trace日志
:追踪文件,记录各种 sql 操作及所消耗的时间等,根据 trace 文件就可以了解哪些 sql 导致了系统的性能瓶颈,进而采取恰当的方式调优- 10g 对应系统初始化参数文件参数
show parameter user_dump_dest
- 11g 同 alert 日志可通过
select * from v$diag_info;
查看日志文件位置(ADR Home) - 日志会一直保留,不会自动删除
- 10g 对应系统初始化参数文件参数
audit日志
:审计的信息- 10g 对应系统初始化参数文件参数
audit_file_dest
- 10g 对应系统初始化参数文件参数
redo日志
:存放数据库的更改信息select member from v$logfile;
member 就代表它的位置
归档日志
:redo 日志的历史备份select * from v$parameter where name like 'log_archive_dest%';
- 日志分析
*.trc
:Sql Trace Collection file,*.trm
:Trace map (.trm) file.Trace files(.trc) are sometimes accompanied by corresponding trace map (.trm) files, which contain structural information about trace files and are used for searching and navigation.
1 | ## 如ADR Home日志文件目录为=/u01/app/oracle/diag/rdbms/orcl/orcl, 下面再分子目录 |
宕机分析
- ORA-27157 ORA-27300 ORA-27301 ORA-27302 错误,这些错误表明共享内存/信号灯在操作系统级别发生了某些情况,信号集可以手动删除,或者由于某种原因由于硬件错误而濒临死亡
1 | # 进入日志文件目录,方式参考上文 |
业务场景
数据恢复
- 基于
of timestamp
恢复,用于少量数据被误删除- 如果报错
ORA-01555: 快照过旧: 回退段号...过小
(说明快照数据已经被Oracle清理了,差不多可以保留1个小时的快照)
- 如果报错
1 | -- 查询某个时间点my_table表的数据 |
表空间相关
表空间数据文件物理位置迁移
- 可以移动任何表空间的数据文件,包括 system 表空间(windows oracle 11g 测试通过)
1 | sqlplus / as sysdba |
对象所在表空间迁移
- 查询表空间使用对象信息,及对象迁移(在进行表或索引移动时,可能会导致一些性能下降或锁定表)
1 | -- 查询表空间使用对象信息 |
删除表空间的某个文件
1 | -- 未验证数据是否会丢失 |
删除表空间
- 表空间数据文件丢失时,删除表空间报错
ORA-02449
、ORA-01115
^6
1 | -- 慎用 |
清理存储空间
- 定时清理数据库日志表
- 清理说明
- delete
- 删除的表数据减少了,但是表空间占用量不会变。可使用move/shrink进行清理
- move和shrink的区别:https://www.modb.pro/db/26483
- lob对象
- 占用空间可以使用alert、move、truncate直接释放。使用delete、update不直接释放,所占用空间会被后续lob对象使用
- delete
- 查看表占用的空间情况SQL参考表空间不足
备份历史数据
- 参考:https://blog.csdn.net/Hehuyi_In/article/details/107775528
- 方法
create table as
备份老数据delete
函数/存储过程/JOB分批提交shrink
收缩表空间
- 案例
1 | -- 将2000年前的数据移到备份表(此处额外创建了一个备份用户方便数据归档:之后只需要备份demo用户下的数据) |
truncate清理
truncate table emp;
oracle清空无用表数据,适用于表中含有大量数据,且全部无用(或者将有用的先备份,然后truncate,最后将数据移动回来)- truncate与drop是DDL语句,执行后无法回滚(无法通过binlog回滚);delete是DML语句,可回滚
- truncate不会激活与表有关的删除触发器;delete可以
- truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉
- truncate不能对有外键约束引用的表使用
- 执行truncate需要drop权限
- 清除后统计user_extents可能暂时没有变化,但是expdp导出数据量明显减少。可手动释放,参考下文
- 外键约束导致无法清理
1 | -- 查看使用某个表作为外键的表信息 |
shrink清理
- 特点
- 可以起到清理存储碎片的功能,类似的如move
- 只有在HWM调整(cascade)阶段会锁表(只能查询),数据重组(compact)阶段可正常增删改
- 实质上构造一个新表(在内部表现为一系列的DML操作,即将副本插入新位置,删除原来位置的记录),因此会产生大量的REDO日志(
select log_mode from v$database;
归档模式下一定要注意磁盘空间,非归档模式则无需考虑) - 索引不会损坏,会随着一起收缩
- lob字段不会级联shrink,需要单独处理
- 可降低dba_extents表占用空间、dba_tables表水位线、dba_data_files表空间占用统计值
- 压缩分两个阶段
- 数据重组(compact):这个过程是通过一系列的insert delete操作,将数据尽量排在列的前面进行重新组合;执行时对相关行持有行锁,对业务影响较小
- HWM调整(cascade):这个过程是对HWM的调整,释放空闲数据库;表上会持有X锁,阻塞DML增删改操作,对业务影响较大,需要在业务空闲时再执行(实际测试过程虽然有锁,但仍然可插入数据)
- 参考:https://www.cnblogs.com/klb561/p/10995016.html
- 时间记录
- 某表540w条记录,HWM高水位线为19.5G,浪费空间18.5G(实际使用空间只有1G,由于表中一个CLOB字段存储了接口请求日志,后期将此字段置空,从而导致空间浪费)。耗时记录:compact阶段耗时105min,cascade阶段耗时10min
- 案例
1 | -- 基本语法 |
move清理
- 特点
- 可以起到清理存储碎片的功能,类似的如shrink。可解决delete删除数据后占用的表空间不会释放
- 会锁表(只能查询),大表谨慎在线操作
- 需要保证有足够大的空闲表空间,迁移5G数据,需要额外空闲5G的表空间来用于存储
- move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效(一般需要重建索引)
- move过的普通表,在不用到失效的索引的操作语句中,语句执行正常;但如果操作的语句用到了索引(主键当做唯一索引),则此时报告用到的索引失效,语句执行失败;其他如外键,非空约束,缺省值等不会失效
- LONG类型不能通过move来传输,尽量不要用LONG类型
- LOB类型在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(segment_type=LOBSEGMENT),另一个用来存放索引(segment_type=LOBINDEX),默认它们会存储在和表一起的表空间。我们对表move时,LOG类型字段和该字段的索引不会跟着move,必须要单独来进行move
- 案例
1 | -- 移动表到当前空间(需要当前表空间有足够的空闲空间来存储当前的数据),即重建此表数据(清理存储碎片功能):可解决delete删除的表数据减少了,但是表空间占用量不会变 |
UNDOTBS1占用较大表空间
- 主要暂时存储DML操作的数据,主要作用有回滚、恢复实例、读一致性,闪回。
1 | # 参考:https://blog.csdn.net/wxlbrxhb/article/details/14448777 |
清理数据库日志表
1 | -- 删除非活动状态的 redo logfile (STATUS=INACTIVE) |
定时清理数据库业务日志表
导入导出
- 导出表结构:使用pl/sql的导出用户对象(不要使用导出表)
.dmp
适合大数据导出;.sql
适合小数据导出(表中含有 CLOB 类型字段则不能导出)- expdp速度比exp快很多,但是不支持增量备份,适用于全量数据导出导入的场景
dmp格式导出导入
- 时间参考
- 优化exp/imp导入导出速度 https://www.cnblogs.com/keanuyaoo/p/3275766.html
1
2
3
4
5
6# exp/imp:表空间30G,导出dmp文件大小20G(导出时已经使用过压缩模式,可再压缩成zip包为2G),导出耗时30min;导入耗时1h
# 耗时22min导出16G tar压缩后只有2.5G耗时几分钟
exp sys/manager@orcl file=exp_test_2023101001.dmp log=exp_test_2023101001.log owner=test grants=y direct=y recordlength=65535
# 耗时40min导出16G (加不加compress=y是一样的)
exp sys/manager@orcl file=exp_test_2023101002.dmp log=exp_test_2023101002.log owner=test grants=y buffer=409600000
- 优化exp/imp导入导出速度 https://www.cnblogs.com/keanuyaoo/p/3275766.html
exp/imp导出
- exp/imp备份
- 参考:https://www.cnblogs.com/songdavid/articles/2435439.html
- 全量备份脚本参考shell.md#备份oracle、bat.md#oracle数据库备份
- 输入
imp/exp 用户名/密码
可根据提示导入导出。直接 cmd 运行 ^4- 成功提示
Export terminated successfully [with/without warnings]
- 失败提示
Export terminated unsuccessfully [with/without warnings]
- 成功提示
- 导入导出均分为全量模式、用户模式、表模式
- 支持增量备份,但是增量备份的最小单位是表,只要表一条数据发生变化,就会对全表进行备份(用处不大)
- 注意事项
- 一定要注意服务器、客户端字符集
NSL_LANG
,否则可能出现数据、字段备注、存储过程等乱码- 查询字符集参考本文查询相关(查询数据库字符集)
- 在导入DMP文件前,在客户端导入与服务器一致的环境变量,例如:
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
,或者在/etc/profile、oracle用户的.bash_profile
文件中导出NLS_LANG
- 如果是基于用户模式进行导入,需要先创建用户和该用户默认表空间,且要保证表空间容量足够
- 如果容量不够,导入数据会卡主,报错ORA-1659
- 此时不关闭导入窗口,新增数据空间文件后,程序会自动继续导入,但是可能会出现索引创建失败而丢失
- 导出时会漏表
- 参考:https://www.cnblogs.com/abclife/p/10006815.html
- 在11gR2之前,oracle数据表被创建时就分配空间;
- 从11gR2(11.2.0.1)中引入了一个新特性:deferred segment creation。11gR2之后,参数deferred_segment_creation默认是true,表示表中插入第一条数据才会分配磁盘空间。空表还没有在磁盘上分配空间,不能被exp导出
- 解决方法
- 最简单的解决方案是使用expdp代替exp(expdp的参数和exp稍有不同,导入需要使用impdp)
- 或者
select 'alter table '||table_name||' allocate extent;' from user_tables where segment_created = 'NO';
生成语句并执行(手动分配空间)select 'alter table '||table_name||' allocate extent;' from dba_tables where segment_created = 'NO' AND owner = 'SMALLE';
- dmp文件压缩与传输
- dmp导出时使用了压缩模式,之后仍然可以打包成zip/tar压缩包,体积会小很多
- dmp文件直接传输到服务器,可能会被拦截,可打成压缩包
- dmp文件过大时(1G以上),直接传输服务器中途容易断掉;可通过FTP进行断点续传
- 一定要注意服务器、客户端字符集
- 导出
1 | # 可将导出的dmp文件再tar压缩后通过scp传输到另外一台服务器上 |
- 导入
1 | echo $NLS_LANG # 查看客户端编码 |
- 常见错误
- 导出报错
EXP-00008 ORA-01455
- 查看该用户下是否有物化视图日志,如果不需要可删除。参考:http://bbs.cqsztech.com/forum.php?mod=viewthread&tid=1678
DROP MATERIALIZED VIEW LOG ON AEZOCN.TEST
参考:https://www.modb.pro/db/224544
- 也有说需要为空表手动分配段(测试无效),参考:https://www.jianshu.com/p/08a338bfc3f6
- 查看该用户下是否有物化视图日志,如果不需要可删除。参考:http://bbs.cqsztech.com/forum.php?mod=viewthread&tid=1678
- 导出报错
expdp/impdp导出
- expdp/impdp成对使用 (不支持增量导出)。支持11.2/19c
- 使用参考:https://www.cnblogs.com/Jingkunliu/p/13705626.html
- compression压缩说明(可不使用此参数,导出后再通过tar压缩):https://blog.csdn.net/yifeng0504/article/details/77748719
1 | ## sql: 创建目录并赋权 |
增量备份参考
- Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP、EXPDP/IMPDP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份
- exp增量备份的最小单位是表,只要表一条数据发生变化,就会对全表进行备份
- expdp/impdp不支持增量备份
- RMAN备份为物理备份,需要保证导出和导入的数据库版本和相关配置一致
- 基于exp/imp的增量备份参考
- 基于RMAN增量备份
pl/sql方式
- pl/sql 提供 dmp、sql(SQL Inserts, 不支持 CLOB 类型字段)、pde(pl/sql 提供)格式的数据导入导出
- dmp格式导入导出
- 其中 Executable 路径为
%ORACLE_HOME%/BIN/exp.exe
和%ORACLE_HOME%/BIN/imp.exe
如:D:/java/oracle/product/11.2.0/dbhome_1/BIN/exp.exe
- 其中 Executable 路径为
- sql格式导入导出
- 导入时SQL*Plus Executable选择
%ORACLE_HOME%/BIN/sqlplus.exe
文件,或者勾选基于命令行导入
- 导入时SQL*Plus Executable选择
- pde格式导入导出,慎用
- 使用PL/SQL绿色版导出pde,直接会将被导出的表数据删掉
- 当
View
按钮可点击时,即表示导出完成
- dmp格式导入导出
- 导出导入对象结构
Tools - Export User Objects - 选择表/序列/存储过程等
导出结构
- 导出导入表数据
Tools - Export Tables - 选择表导出
导出数据Tools - Import Tablse - 选择导入文件
导入数据
- 命令窗口执行SQL文件(plsql 执行 sql 文件)
start D:/sql/my.sql
或@D:/sql/my.sql
(部分语句需要执行commit
提交,文件不要放在C盘)
sql导出导入(sqlplus)
- 导出查询结果
- 基于SPOLL
- 对于CLOB等字段比较麻烦
1 | -- 运行时去掉备注 |
- 导入:
@/home/imp.sql
,或者命令行运行sqlplus root/root@127.0.0.1:1521/orcl @imp.sql
Oracle表结构与Mysql表结构转换
数据库内存调整
1 | -- 模拟操作系统内存从2G增加为8G, 一般设置shmmax不超过物理内存的75%(8*0.75*1024*1024*1024=6442450944) |
- 遇到的问题
1 | -- 实践中遇到一下问题 |
创建数据库实例
一般新建数据库实例名为orcl,此时需要再创建一个实例orcl2(这样可以创建和orcl一样的表空间)
- windows参考:https://blog.csdn.net/qq_43222869/article/details/107067357
Database Configuration Assistant
- 创建数据库 - 设置数据库名称和SID(两者最好保持一致,并且一定要记住) - 其他步骤保持不变。如果需要使用sqlplus登录,还需配置lsnrctl status
可查看到listener.ora监听配置文件位置,需将新实例配置到SID_LIST_LISTENER中1
2
3
4
5
6
7
8
9
10
11
12
13SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = G:\app\Administrator\product\11.2.0\dbhome_1)
(ENVS = "EXTPROC_DLLS=ONLY:G:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(SID_NAME = orcl2)
(ORACLE_HOME = G:\app\Administrator\product\11.2.0\dbhome_1)
(ENVS = "EXTPROC_DLLS=ONLY:G:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)由于sqlplus指定实例时使用的是listener.ora同级目录下的tnsnames.ora文件,需要将orcl2的配置加上才能使用
- 创建完之后,原来的数据库实例会正常运行。新实例会在服务中创建OracleServiceORCL2(TNS Listener是共用的,不会创建新的)
- 指定实例登录
sqlplus system/root@orcl2 as sysdba
记录数据变动日志
基于数据库触发器+sys_context实现用户信息通过数据库会话传递
- client_identifier使用: https://juejin.cn/post/7126934623023530015
- V$SESSION的CLIENT_INFO列和CLIENT_IDENTIFIER列往往为空,所以需要写登录触发器,然后在触发器中使用如下的存储过程记录这2列的值
- sys_context使用: https://blog.csdn.net/db_murphy/article/details/115186884
- DBMS_SESSION包详解: https://www.cnblogs.com/shujk/p/13983202.html
核心代码
还有一思路是通过AOP监听getConnection()方法的执行,进行注入参数(测试了下AOP进不去)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public DataSource dataSource(DataSourceProperties properties) {
return new IdentifierDataSource(properties.initializeDataSourceBuilder().build());
}
public static String SET_IDENTIFIER_SQL = "{ call DBMS_SESSION.SET_IDENTIFIER(?) }";
public static class IdentifierDataSource extends DelegatingDataSource {
public IdentifierDataSource(DataSource delegate) {
super(delegate);
}
public Connection getConnection() throws SQLException {
Connection connection = super.getConnection();
try {
CallableStatement cs = connection.prepareCall(SET_IDENTIFIER_SQL);
cs.setString(1, ShiroUtils.getOperNam() == null ? "" : ShiroUtils.getOperNam());
cs.execute();
cs.close();
} catch (Exception e) {
log.error("设置用户会话信息出错", e);
}
return connection;
}
}触发器
1
2
3
4
5
6
7
8
9
10CREATE OR REPLACE TRIGGER SAMIS45_SHSD.tub_ship_log
BEFORE UPDATE OF ETA_TIM,REMARK_TXT
ON ship
FOR EACH ROW
DECLARE
up_str VARCHAR2(1000);
begin
-- 获取应用登录用户信息
select sys_context('userenv','client_identifier') from dual;
END;
SpringBoot+Mybatis-Plus+ThreadLocal利用AOP+mybatis插件实现数据操作记录及更新对比: https://www.cnblogs.com/top-sky-hua/p/13321754.html
密码策略修改
1 | -- 查询user是否锁定、及时间 |
审计
1 | -- 查看有效账号(account_status='OPEN')和账号(NAME)最近密码修改日期(PTIME) |
日常维护
- 检查
listener.log
是否过大- 可能产生异常场景:实例 tnsping 突然高达 1w 多毫秒,发现listener.log达到4G
- 解决:日志文件过大,可重新创建一个此日志文件(或者直接删掉,重启TNS会自动创建此文件)
- listener.log目录如
g:\app\administrator\diag\tnslsnr\主机名\listener\trace\listener.log
- 查看文件位置
show parameter dump;
得到如user_dump_dest => g:\app\administrator\diag\rdbms\orcl\orcl\trace
- 从而得知日志目录为:
g:\app\administrator\diag
- 然后在此目录查找
tnslsnr/主机名/listener/trace/listener.log
文件
- 查看文件位置
常见错误
数据库服务器CPU飙高
- 参考数据库服务器故障
表空间不足
报错
ORA-01653: unable to extend table
^7- 重设(不是基于原大小增加)表空间文件大小:
alter database datafile '数据库文件路径' resize 2000M;
(表空间单文件默认最大为 32G=32768M,与 db_blok_size 大小有关,默认 db_blok_size=8K,在初始化表空间后不能再次修改) - 开启表空间自动扩展,每次递增 50M
alter database datafile '/home/oracle/data/users01.dbf' autoextend on next 50m;
- 为 USERS 表空间新增 1G 的数据文件
alter tablespace users add datafile '/home/oracle/data/users02.dbf' size 1024m;
- 此时增加的数据文件还需要再次运行上述自动扩展语句从而达到自动扩展
alter database datafile '/home/oracle/data/users0.dbf' autoextend on next 50m;
- 此处定义的 1G 会立即占用物理磁盘的 1G 空间,当开启自动扩展后,最多可扩展到 32G
- 增加完数据文件后,数据会自动迁移,最终达到相同表空间的数据文件可用空间大概一致
- 此时增加的数据文件还需要再次运行上述自动扩展语句从而达到自动扩展
增加数据文件和表空间大小可适当重启数据库。查看表空间状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57-- 查看表空间
-- 如果表空间不足,此sql语句可能无法显示出来该表空间,可单独查询其中的a表空间
select a.tablespace_name "表空间名",
a.bytes / 1024 / 1024 "表空间大小(m)", -- 此文件对应空间不够则会自动递增,一直增加到最大文件大小 32G
(a.bytes - nvl(b.bytes, 0)) / 1024 / 1024 "已使用空间(m)",
case when b.bytes is null then 0 else b.bytes / 1024 / 1024 end "空闲空间(m)",
case when b.bytes is null then 0 else round(((a.bytes - b.bytes) / a.bytes) * 100, 2) end "使用比",
a.file_name "全路径的数据文件名称",
autoextensible "表空间自动扩展",
increment_by "自增块(默认1blocks=8k)",
a.online_status "表空间文件状态"
from (select tablespace_name, file_name, autoextensible, increment_by, sum(bytes) bytes, online_status
from dba_data_files
group by tablespace_name, file_name, autoextensible, increment_by, online_status) a
left join
(select tablespace_name, sum(bytes) bytes, max(bytes) largest
from dba_free_space
group by tablespace_name) b
on a.tablespace_name = b.tablespace_name;
-- 查看oracle临时表空间
select tablespace_name "表空间名", file_name "全路径的数据文件名称", sum(bytes) / 1024 / 1024 "表空间大小(m)", autoextensible "表空间自动扩展", increment_by "自增块(默认1blocks=8k)"
from dba_temp_files
group by tablespace_name, file_name, autoextensible, increment_by;
-- 列出数据库里每张表分配的物理空间(基本就是每张表使用的物理空间)
select segment_name, segment_type, tablespace_name, sum(bytes)/1024/1024/1024 as "GB"
from user_extents
group by segment_name, segment_type, tablespace_name order by sum(bytes) desc;
-- dba
select segment_name, segment_type, tablespace_name, sum(bytes)/1024/1024/1024 as "GB"
from dba_extents where owner = 'SMALLE'
group by segment_name, segment_type, tablespace_name order by sum(bytes) desc;
-- 上面结果返回中如果存在SYS_LOBxxx的数据(oracle会将[C/B]LOB类型字段单独存储),则可通过下面语句查看属于哪张表
select * from dba_lobs where segment_name like 'SYS_LOB0000109849C00008$$';
-- 查看所有LOB块信息
select * from dba_lobs where segment_name in
(select segment_name from user_extents group by segment_name having segment_name like 'SYS_LOB%');
-- 列出数据库里每张表的记录条数
select t.table_name,t.num_rows from user_tables t order by num_rows desc;
-- 查看表占用的空间情况(浪费的空间可通过shrink或move等方式清理,清理后表空间统计值会变小)
-- 如果对表做了数据清理,需要先重新统计下表信息,再查看表占用空间。或者通过存储过程批量更新:https://deepinout.com/oracle/oracle-questions/321_oracle_oracle_manually_update_statistics_on_all_tables.html
exec dbms_stats.gather_table_stats(ownname=>'SCOTT', tabname=> 'MY_TABLE_XX'); -- command窗口执行(会卡一会)
-- select table_name,last_analyzed from dba_tables where owner = 'SCOTT'; -- 查看上次一次统计时间
-- 查看表占用的空间情况(查看高水位线)
select table_name,
round(((blocks) * 8 / 1024), 2) "高水位空间M",
round((num_rows * avg_row_len / 1024 /1024), 2) "真实使用空间M",
round((blocks * 10 / 100) *8 /1024, 2) "预留空间(pctfree)M",
round((blocks) * 8 / 1024 - (num_rows * avg_row_len / 1024 / 1024) - blocks * 8 * 10 / 100 / 1024, 2) "浪费空间M"
from dba_tables -- user_tables
where temporary = 'N'
and owner = 'MY_OWNER_XXX'
-- and table_name = 'MY_TABLE_XXX'
order by 5 desc; -- 按照第5个字段排序
- 重设(不是基于原大小增加)表空间文件大小:
报错
ORA-01654:unable to extend index
,解决步骤 ^8- 情况一表空间已满:通过查看表空间
USERS
对应的数据文件users01.dbf
文件大小已经 32G(表空间单文件默认最大为 32G=32768M,与 db_blok_size 大小有关,默认 db_blok_size=8K,在初始化表空间后不能再次修改)- 解决方案:通过上述方法增加数据文件解决
- 情况二表空间未满:查询的表空间剩余 400M,且该索引的 next_extent=700MB,即给该索引分配空间时不足
- 解决方案:重建该索引
alter index index_name_xxx rebuild tablespace tablespace_name_xxx storage(initial 256K next 256K pctincrease 0)
(还未测试)
- 解决方案:重建该索引
- 情况一表空间已满:通过查看表空间
数据库无法连接
- 查看数据库连接设置
1 | -- 查看当前数据库建立的会话情况 |
- 查看应用连接池设置的大小
No more data to read from socket
- 方向
- 是否连接不足,参考数据库无法连接
- 是否连接失效
- 一般由数据库连接池管理,问题不大;但是如果重启了数据库,应用的连接池创建的连接就回失效
- 分布式数据库中间件,比如 cobar 会定时的将空闲链接异常关闭,客户端会出现半开的空闲链接
- 是否为内存不足导致
- 是否为网络原因,路由交换机重启等
- 查询数据库发现报错
ORA-03137
- 参考文章
- 临时解决
- 客户端报错
No more data to read from socket
,数据库发现报错ORA-03137
,且在产生大量incident日志文件;但是此问题是最近才偶尔出现此问题,一般不会是客户端连接池问题,初步诊断为数据库问题,暂时不好升级Oracle和关闭_optim_peek_user_binds参数 - 选择先升级ojdbc.jar驱动程序为11.2.0.2,并优化此SQL语句
- 客户端报错
1 | Dump continued from file: /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_20306.trc |
Oracle安装
- 数据库安装包:oracle
- oracle 静默安装, 关闭客户端后再次以 oracle 用户登录无法运行 sql 命名, 需要执行
source ~/.bash_profile
- oracle目录
- Oracle基目录为
D:/java/oracle
,基目录只是把不同版本的oracle放在一起 - ORACLE_HOME 为
D:/java/oracle/product/11.2.0/dbhome_1
,%ORACLE_HOME%/bin
中为一些可执行程序(如:导入 imp.exe、导出 exp.exe)
- Oracle基目录为
PL/SQL安装和使用
- PL/SQL绿色版安装
- 直接解压,修改Oracle64/tnsnames.ora文件,然后点击qidong.bat即可。无需配置任何环境变量或oci.dll路径
- 修改配置项
- 配置 - User Interface - Fonts - Browser/Grid/Main Font(Segoe UI,常规,小五); Editor(Courier New,常规,10)
- 配置 - User Interface - Appearance - Language(选择英文), Switch to Menu(菜单以下拉菜单方式显示)
PL/SQL完整版安装
- Oracle 需要装 client 才能让第三方工具(如 pl/sql)通过 OCI(Oracle Call Interface)来连接,安装包可以去 oracle 官网下载 Instant Client
- 安装
pl/sql developer
- 将
instantclient_10_2
(oracle 的客户端),复制到 oracle 安装目录(D:\java\oracle\product,其他目录也可以) - 配置
pl/sql developer
首选项中连接项。设置 oracle_home 为 instantclient_10_2 的路径,oci 为 instantclient_10_2 下的 oci.dll - 环境变量配置(必须)
- ORACLE_HOME
- 安装 oracle 则需要配置 oracle 目录(
ORACLE_HOME=D:\java\oracle\product\11.2.0\dbhome_1
) - 不安装 oracle 也可使用 pl/sql. 需要配置环境变量指向客户端目录(
ORACLE_HOME=D:\java\oracle\product\instantclient_10_2
)
- 安装 oracle 则需要配置 oracle 目录(
TNS_ADMIN=D:\java\oracle\product\instantclient_10_2
(tnsnames.ora
的上级目录),并在 path 末尾加入%TNS_ADMIN%;
(否则容易报TNS-12541
)
- ORACLE_HOME
- 其他配置(可忽略)
- 环境变量设置
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
、nls_timestamp_format=yyyy/mm/dd hh24:mi:ssxff
(PLSQL 查询中可直接使用时间字符串,代码中最好通过 to_date 转换)
- 环境变量设置
相关错误
- instantclient_10_2 匹配 11.2.0 的 oracle 可能会报错(如 OCI: not initialized、请确认安装了 32 位 oracle client)
- 可到Instant Client Downloads for Microsoft Windows (32-bit)下载对应 pl/sql 的版本(instantclient-basic-nt-11.2.0.4.0.zip),压缩包中没有
tnsnames.ora
和listener.ora
可到$ORACLE_HOME/NETWORK/ADMIN
中复制(64 位机器可安装 32 位 pl/sql,此时 Instant Client 也应该是 32 位)
- 可到Instant Client Downloads for Microsoft Windows (32-bit)下载对应 pl/sql 的版本(instantclient-basic-nt-11.2.0.4.0.zip),压缩包中没有
网络配置
- Net Manager 的使用(
$ORACLE_HOME/BIN/launch.exe
)- 打开网络配置文件时,则打开
$ORACLE_HOME/NETWORK/ADMIN
目录 本地-监听程序-LISTENER
中的主机要为计算机全名(如:ST-008),对应文件$ORACLE_HOME/NETWORK/ADMIN/listener.ora
- 使用 pl/sql 也需要配置,且第一个 ADDRESS 需要类似配置为
TCP/IP,ST-008,1521
- 使用 pl/sql 也需要配置,且第一个 ADDRESS 需要类似配置为
本地-服务命名
下的都为网络服务名
,对应文件tnsnames.ora
- 有的需参考 https://blog.csdn.net/pengpengpeng85/article/details/78757484 创建监听程序配置和本地网络服务名配置
- 打开网络配置文件时,则打开
文本操作
- 使用 sqlplus 登录时,可直接修改
$ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
- 安装了 pl/sql,可能需要修改 tnsnames.ora 的文件路径类似与
D:\java\oracle\product\instantclient_10_2\tnsnames.ora
。此时 oracle 自带的 tnsnames.ora 将会失效 配置实例:HOST/PORT 分别为远程 ip 地址(或127.0.0.1)和端口,SERVICE_NAME 为远程服务名,aezocn 为远程服务名别名(本地服务名)
1
2
3
4
5
6
7
8
9
10aezocn =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
- 使用 sqlplus 登录时,可直接修改
如果 oracle 服务在远程机器上,本地通过 plsql 连接,则不需要在本地启动任何和 oracle 相关的服务。如果本地机器作为 oracle 服务器,则需要启动 OracleServiceORCL,此时只能在命令行连接数据库,如果需要通过 plsql 连接则需要启动类似”OracleOraDb11g_home1TNSListener”的 TNS 远程监听服务
ODAC/ODBC/JDBC
- ODAC全称:oracle Date Access Components,为oracle数据访问组件,32位的安装包在32位,64位的都可以采用的
- 执行安装程序 - 下一步 - Oracle Client 11.2.0.3 - Oracle基目录=D:\java\oracle,软件位置名称=OraClient11g_home2,路径=D:\java\oracle\product\11.2.0\dbhome_2 - 下一步 - 安装
- 如果提示“服务OracleMTSRecoveryService已经存在” - 忽略
- 或者下载ODAC112030Xcopy_64bit.zip等压缩包进行安装,推荐
- ODBC:Windows上通过配置不同数据库(SQL Server、Oracle等)的驱动进行访问数据库。找到控制面板-管理工具-数据源ODBC
JDBC连接
支持负载均衡模式
1
2
3
4
5
6
7
8
9
10
11
12
13jdbc:oracle:thin:@(DESCRIPTION =
(failover = on)
(LOAD_BALANCE = off)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
(failover_mode = (type = select) (method = basic))
)
)
Oracle-19c
常见问题
- 启动项目报错
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 59: D:\software\oracle\product\11.2.0\dbhome_1\NETWORK\ADMI;C:\Program Files\Java\jdk1.8.0_31\ojdbc.properties
- 背景:项目使用oracle 19c,引入ojdbc8,服务器部署了oracle 11g服务,之前使用ojdbc6的项目能正常启动,使用ojdbc8则报错
- 解决:在项目启动脚本前增加
set TNS_ADMIN=
去掉服务器原来的TNS_ADMIN环境变量 - 原因:ojdbc8中会优先取读取
oracle.net.tns_admin
属性(对应的是TNS_ADMIN环境变量)
图片说明
lsnrctl-status 显示图片
- 服务正常如下图有
Service "orcl" has 1 instance(s).
服务异常如
The listener supports no services
表示无服务启动
- 服务正常如下图有
参考文章