网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
20 rows selected.
SQL>
**来源于props$,是表示数据库的字符集。**
\*\*2、如何查询dmp文件的字符集 \*\*
用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有 几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
SQL> select nls_charset_name(to_number(‘0354’,‘xxxx’)) from dual;
NLS_CHARSET_NAME(TO_NUMBER(‘0354’,‘XXXX’
ZHS16GBK
SQL>
如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
#cat exp.dmp | od -x | head -1 | awk ‘{print $2 $3}’ | cut -c 3-6
然后用上述SQL语句也可以得到它对应的字符集。
注意:使用exp/imp 导入导出时是需要设定字符集的,因为它是一个客户端工具。生成的dmp文件根据客户端的字符集来定(如果你没有设置的话),这样如果导出源客户端和目标端数据库字符集不一致,imp导入就会出现乱码;而expdp/impdp工具是不依赖NLS\_LANG的,它是基于源端和目标端NLS\_CHARACTERSET。
**3、查询oracle client端的字符集**
在windows平台下,就是注册表里面相应OracleHome的NLS\_LANG。还可以在dos窗口里面自己设置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量NLS\_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
\*\*4、修改oracle的字符集 \*\*
一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转 换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而 言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来 说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和 ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
\*\*修改server端字符集(不建议使用) \*\*
在oracle 8之前,可以用直接修改数据字典表props
来
改
变
数
据
库
的
字
符
集
。
但
o
r
a
c
l
e
8
之
后
,
至
少
有
三
张
系
统
表
记
录
了
数
据
库
字
符
集
的
信
息
,
只
改
p
r
o
p
s
来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props
来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props表并不完全,可能引起严重的后果。正确的修改方法如下:
$sqlplus /nolog
SQL>conn / as sysdba; #若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
\*\*注意:\*\*如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能startup) 按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息 要解决这个问题有两种方法,一个是,利用INTERNAL\_USE 关键字修改区域设置, 还有一个是利用re-create,但是re-create有点复杂,所以请用internal\_use。
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP MOUNT EXCLUSIVE;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
SQL>SHUTDOWN immediate;
SQL>startup;
如果按上面的做法做,National charset的区域设置就没有问题
\*\*修改dmp文件字符集 \*\*
上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅 是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如 US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。
比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:
SQL> select to_char(nls_charset_id(‘ZHS16GBK’), ‘xxxx’) from dual;
TO_CH
354
SQL>
然后将dmp文件的2、3字节修改为0354即可。
如果dmp文件很大,用ue无法打开,就需要用程序的方法了。
## Oracle 数据库查看client的用户登录信息包括ip
通过创建触发器对用户登录进行日志记录,对登录用户进行相关审计,记录登录用户,主机,系统用户及IP地址:
**1. 在sys模式下创建一个表,用于记录客户端登录数据库服务器的详细信息。**
create table login_history
(
username varchar2(60), --用户名
machine varchar2(60), --机器名
login_time date, --登录时间
ip varchar2(50) --ip地址
);
或者
SQL> create table LOGON_TABLE as
select sysdate logon_time,
sys_context(‘USERENV’,‘SESSION_USER’) username,
sys_context(‘USERENV’,‘HOST’) host,
sys_context(‘USERENV’,‘OS_USER’) os_user,
sys_context(‘USERENV’,‘IP_ADDRESS’) ip_address
from dual
/
Table created.
**2. 在sys模式下创建一个触发器。**
create or replace trigger login_log
after logon on database
begin
insert into login_history
select username, machine, sysdate, sys_context(‘userenv’, ‘ip_address’)
from v$session
where audsid = userenv(‘sessionid’);
commit;
end;
或者
SQL> create or replace trigger tri_logon after logon on database
begin
insert into LOGON_TABLE
( logon_time,
username,
host,
os_user,
ip_address
)
values
( sysdate,
sys_context(‘USERENV’, ‘SESSION_USER’),
sys_context(‘USERENV’,‘HOST’),
sys_context(‘USERENV’,‘OS_USER’),
sys_context(‘USERENV’,‘IP_ADDRESS’));
end;
/
Trigger created.
**3. 一些查看session数的实例(以sys用户登录)**
–查看login_history表
select * from login_history;
–查看当前的所有session数
select count(*) from v$session;
–查看当前的客户端计算机名为RHEL的所有session数
select count(*) from v$session where machine = ‘RHEL’;
–查看当前的各个客户端计算机的连接数
select count(*) , machine from v$session group by machine;
**4. 查看当前会话的ip**
select sys_context(‘userenv’,‘ip_address’) from dual;
## 扩展
## oracle密码过期策略
自从上次由于时钟跳变,造成Oracle数据库宕机,我对这个用户的业务系统一直满怀一颗敬畏之心
远程上去看日志,还好,提示是Oracle的密码过期了
从Oracle 10g开始,密码默认是180天过期
解决方法,输入下面两行,将过期时间设置为“无限制”
alter profile default limit password_life_time unlimited;
commit;
注意 :**vMware的vCenter虚拟机也有类似的设置,root密码默认90过期**
![img](https://img-blog.csdnimg.cn/img_convert/27baf585657d034e430f037eb465cd9a.png)
![img](https://img-blog.csdnimg.cn/img_convert/bf76a7d6077a474d6380a0e880c4330b.png)
![img](https://i-blog.csdnimg.cn/blog_migrate/d29057a2bbba712e5ced725bc89e9d0e.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**
e_time unlimited;
commit;
注意 :vMware的vCenter虚拟机也有类似的设置,root密码默认90过期
[外链图片转存中…(img-7SI2a9ZQ-1715047987164)]
[外链图片转存中…(img-ao8xcOJx-1715047987164)]
[外链图片转存中…(img-thKkqS5d-1715047987165)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新