重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
比如将sid=orcl 更改为sid=db01
创新互联建站主营潢川网站建设的网络公司,主营网站建设方案,成都APP应用开发,潢川h5微信小程序搭建,潢川网站营销推广欢迎潢川等地区企业咨询
1.shutdown immediate
2.[oracle@oracle ~]$ vi .bash_profile
export ORACLE_SID=bd01
[oracle@oracle ~]$ source .bash_profile(使其生效)
3.修改 /etc/oratab 文件 ; 在文件的最后一行 将 orcl 改为db01
db01:/u01/app/oracle/product/10.2.0:N
4. 接下来就应该修改 oracle 目录里边的文件 cd
/$ORACLE_HOME/dbs 把所有包含 orcl 的文件名 ,修改为 包含 db01 的文件名
mv
hc_orcl.dat hc_db01.dat
mv lkORCL lkDB01
mv spfileorcl.ora
spfildb01.ora
mv orapworcl
orapwdb01
5.重建口令文件 我的用户名密码
为:oracle@oracle
[oracle@oracle dbs]$ orapwd
file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle
6 启动数据库,更改sid成功
SQL startup
select instance_name from v$instance;
INSTANCE
下面说明在SQL
DEVELOPER中的做法,右击存储结构的文件名,在菜单中选择RUN,会跳出一个叫RUN
PL/SQL的页面,在下方写着PL/SQL
BLOCK
的地方修改输入参数
spno
=spno
修改为spno
=真实的值
具体可以参看HELP中的Run/Debug/Profile
PL/SQL
在oracle中,用户的默认永久性表空间为system,默认临时表空间为temp。如果所有的用户都使用默认的临时表空间,无疑会增加system与temp表空间的竞争性。
oracle允许使用自定义的表空间作为默认的永久性表空间,使用自定义临时表空间作为默认临时表空间。
设置默认的表空间的语法如下。
alter database default [temporary] tablespace tablespace_name
如果使用temporary关键字,则表示设置默认临时表空间;如果不适用该关键字,则表示设置默认永久性表空间。
查询默认的表空间
select property_name,property_value from database_properties where property_name in('DEFAULT_PERMANENT_TABLESPACE','DEFAULT_TEMP_TABLESPACE'); PROPERTY_NAME PROPERTY_VALUE -------------------- -------------------- DEFAULT_TEMP_TABLESP TEMP DEFAULT_PERMANENT_TA USERS
如上面的查询结果所示,系统默认的临时表空间为temp,默认的新用户的表空间为users。
1. 备份数据库中所有用户的数据
以oracle用户登陆,执行以下命令
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
保持与数据库服务器端一致,这样在exp导出时,就不会存在字符的转换了,备份最原始的数据。
2. 评估UTF8转换成ZHS16GBK的风险
转换之前,要使用Oracle的csscan工具对数据库扫描,评估字符集转换前后,数据有可能的损坏情况。如果评估情况糟糕,那就绝对要放弃了。
先安装属于 CSMIG 用户的一套表和过程。以oracle用户登陆UNIX,
#sqlplus “/ as sysdab”
SQL@$ORACLE_HOME/ rdbms/admin/csminst.sql
SQLexit
# $ORACLE_HOME\bin\csscan -help
可以更清楚如何使用csscan。
# $ORACLE_HOME/bin/csscan system/sunday user=mmsc FROMCHAR=UTF8 TOCHAR=ZHS16GBK ARRAY=102400 PROCESS=3 csscan.log
以上命令意思是扫描用户:mmsc中的所有数据,从字符集UTF8更改为ZHS16GBK的转换情况。然后得到三个文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用户下的所有的数据都是可以转换的,并且没有出现转换“Exceptional”的情况,因此可以更放心一点。
3. 更改数据库的字符集为ZHS16GBK
前面说过,通过命令“Alter Database Characeter Set XXXX”,实现从超集到子集的转换,在Oracle是不允许的。但是该命令,提供这样的命令方式:
Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX
如何更改Oracle字符集
国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长度存储一个汉字。UTF8字符集是多字节存储,1个汉字(简体、繁体)有时采用3个字符长度存储。
Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是说UTF8是ZHS16GBK的严格超集。
对于子集到超集的转换,Oracle是允许的,但是对于超集到子集的转换是不允许的。一般对于超集到子集的转换,建议是通过dbca删除原来的数据库,重新再建库,选择正确的字符集,然后导入备份。
我的方案是:先备份数据,然后强制转换字符集从UTF8到ZHS16GBK,然后导入备份数据。如果不行,才来重新建库,设置字符集ZHS16GBK,导入备份数据。如果这还不行,就把更改字符集从ZHS16GBK到UTF8(这是安全的),再导入备份数据,恢复到原始状况。这样就有可能避开重新建库的麻烦。
1. 备份数据库中所有用户的数据
以oracle用户登陆,执行以下命令
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
保持与数据库服务器端一致,这样在exp导出时,就不会存在字符的转换了,备份最原始的数据。
2. 评估UTF8转换成ZHS16GBK的风险
转换之前,要使用Oracle的csscan工具对数据库扫描,评估字符集转换前后,数据有可能的损坏情况。如果评估情况糟糕,那就绝对要放弃了。
先安装属于 CSMIG 用户的一套表和过程。以oracle用户登陆UNIX,
#sqlplus “/ as sysdab”
SQL@$ORACLE_HOME/ rdbms/admin/csminst.sql
SQLexit
# $ORACLE_HOME\bin\csscan -help
可以更清楚如何使用csscan。
# $ORACLE_HOME/bin/csscan system/sunday user=mmsc FROMCHAR=UTF8 TOCHAR=ZHS16GBK ARRAY=102400 PROCESS=3 csscan.log
以上命令意思是扫描用户:mmsc中的所有数据,从字符集UTF8更改为ZHS16GBK的转换情况。然后得到三个文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用户下的所有的数据都是可以转换的,并且没有出现转换“Exceptional”的情况,因此可以更放心一点。
3. 更改数据库的字符集为ZHS16GBK
前面说过,通过命令“Alter Database Characeter Set XXXX”,实现从超集到子集的转换,在Oracle是不允许的。但是该命令,提供这样的命令方式:
Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX
这是Oracle的非公开命令。“在使用这个命令时,Oracle会跳过所有子集及超集的检查,在任意字符集之间进行强制转换,所以,使用这个命令时你必须十分小心,你必须清楚这一操作会带来的风险”。
以oracle用户登陆UNIX,
#sqlplus “/ as sysdba”
SQL SHUTDOWN IMMEDIATE;
SQL STARTUP MOUNT;
SQL ALTER SESSION SET SQL_TRACE=TRUE;
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;
//如果不使用“INTERNAL_USE”参数,系统会提示出错:
//ERROR at line 1:
//ORA-12712: new character set must be a superset of old character set
SQL ALTER SESSION SET SQL_TRACE=FALSE;
SQL SHUTDOWN IMMEDIATE;
SQL STARTUP;
此时,检查一下数据库的字符集是否更改过来
SQL select value$ from props$ where name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
紧接着检查一下数据库中简体中文、繁体中文是否正常,不会出现乱码。
SQLselect spid,spname,spshortname from spinfovisual_hk
…...
非常不幸,我看到了一堆乱码,这也证明了Oracle不支持字符集从超集到子集的更改,当时心里很紧张,很怕失败,从而恢复到原样。
但是根据以前的验证,把UTF8下的备份导入到ZHS16GBK中去,是OK的,所以继续尝试。
4. 导入备份的用户数据
还是以oracle用户登陆UNIX, 先删除库中的用户mmsc:
#sqlplus “/ as sysdba”
SQLdrop user mmsc cascade;
SQLexit
再运行createuser.sql,生成mmsc用户。
然后使用原来的备份文件,导入到mmsc用户中:
注意:先设置NLS_LANG要与当前数据库的一致:ZHS16GBK。这样,导出时用户会话的NLS_LANG为UTF8,与原先的数据库字符集一致;现在为ZHS16GBK,与此时的数据库字符集一致。这样,导入时,就会进行字符转换。
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
#imp mmsc/mmsc@mdspdb file=DSMPD113_user_mmsc.dmp ignore=y fromuser=mmsc touser=mmsc
马上查看数据库中简体、繁体中文,哈哈,没有乱码了,一切显示正常。
紧接着进行验证,也证明了:1个汉字此时只占用2个字符长度。问题解决了!
spfile是二进制的,所以无法直接修改文件。
两种方法修改:
1、使用下面的语句修改
alter system set 参数名称=参数值 scope=spfile ;
2、生成pfile,修改后使用此pfile生成spfile。
create pfile='路径' from spfile ;
修改后
create spfile from pfile='路径' ;