linux系统中 修改oracle数据库字符集问题

Posted 缺月疏桐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统中 修改oracle数据库字符集问题相关的知识,希望对你有一定的参考价值。

今天在往linux系统下的oracle数据库中导入dmp数据库的数据的时候,出现一些问题,经过多次调整和尝试,最终将数据库调整好,特此记录。

首先,在导出本地的数据库的时候,由于本地的数据库中有建 dblink连接,在用exp命令导出数据的时候,命令行提示  大概  是连接失败的意思,但是看着又不像是数据库用户本身连接失败,经过百度查询知道是因为该用户下存在dblink连接,数据库服务器的版本(11.2.0.4.0 - 64bit)比我本地的客户端的版本(11.2.0.1.0- 64bit)高,百度上说如果使用同样高版本的客户端应该可以顺利导出带有dblink的用户下的数据为dmp,几经周折,也不想将本地的数据库拆除重装,最后确认dblink没有其他用处,索性直接将3个dblink备份sql并删除掉了,删除掉之后,数据库就顺利导出数据了。其实这里还有一种不用删除dblink也能将数据库导出为dmp文件的方式,那就是直接在plsql上导出(只是这种方式导出数据的速度比exp命令导出数据库的速度慢很多)。

顺利导出数据库以为就可以将数据顺利导入到另外一台linux服务的数据库中,当导入数据的时候,问题又来了!导入数据的时候,日志中报错:没有相应的表空间。导致很多相关的表都导入失败,于是drop掉这个user,重新建user和表空间,并授权给扩展该表空间的授权给新建的用户。具体步骤如下:

1、drop掉原来的用户

sqlplus登陆数据库

sqllus /nolong;

conn system/manager as sysdba;

drop user user_name cascade;

2、新建表空间

create tablespace tablespace_name
datafile ‘/data/oracle/tablespace_name.dbf‘
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;

关于上面新建表空间的时候 datafile 想要放的地方,建议放在和 USERS 表空间同一目录下,如果不知道在哪个路径下,可以使用sql查询

SELECT * FROM Dba_Data_Files ddf WHERE ddf.tablespace_name = ‘USERS‘;

查询结果中的file_name字段即是表空间所在的路径

3、新建用户并做授权

create user user_name identified by password;
grant connect,resource,dba to user_name;

alter user user_name quota unlimited on tablespace_name;

4、重新导入数据库dmp文件

imp user_name/password file=/home/oracle/dmp/dmp_file.dmp log=/home/oracle/dmp/log_name.log FULL=y;

这次看日志,应该是顺利导入大部分表数据了,当兴冲冲的登上plsql查看数据的时候,发现中文都是乱码的数据,问题又来了!

这不用说,一定是导出dmp文件的数据库服务器的字符编码(ZHS16GBK)和导入的数据库的服务器的字符集编码(AL16UTF16)是不一致导致的。

无奈!继续drop用户cascade   并修改导入的数据库服务器的字符集编码格式。具体步骤如下:

1、查看两边数据库的字符集编码

select * from nls_instance_parameters where parameter=‘NLS_LANGUAGE‘;

2、修改字符集编码

2.1.以sysdba的身份登录上去 conn /as sysdba

2.2.关闭数据库shutdown immediate;

2.3.以mount打来数据库,startup mount

2.4设置session

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

2.5.启动数据库

alter database open;

2.6.修改字符集

ALTER DATABASE CHARACTER SET ZHS16GBK;

这会可能会报错,提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:

ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

这条语句就可以了,TERNAL_USE提供的帮助就会使oracle绕过了子集与超集的验证,这条语句和上面的语句内部操作时完全相同的。

2.7.关闭,重新启动

SQL>shutdown immediate;
SQL> startup

当然字符集最好不要轻易修改,因为这会对数据库的数据有直接的影响,如果是生产环境的话,可能会造成不可估计得损失。

3、重新删除用户并重建user并授权。

4、重新导入dmp数据。

导入数据之后,在sqlus中查询相关表数据都是正常的,以为大功告成了。可是问题又来了,plsql连不上数据库了,报错:TNS:ORA-12514     我很难受!!!

经过百度查询,尝试如下办法,问题解决:

首先,要找到 新生成的listener.ora文件所在的位置,可以通过 

cd $ORACLE_HOME命令 找到  oracle_home 所在的位置,然通过
lsnrctl命令stop  之后  start监听,日志中会打印出listener文件所在的位置
[[email protected] ~]$ cd $ORACLE_HOME
[[email protected] dbhome_1]$ lsnrctl

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-DEC-2018 23:39:53

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> stop
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ps-server5)(PORT=8083)))
The command completed successfully
LSNRCTL> start
Starting /u01/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.4.0 - Production
System parameter file is /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Log messages written to /u01/app/diag/tnslsnr/ps-server5/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8083)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC8083)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ps-server5)(PORT=8083)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                23-DEC-2018 23:40:15
Uptime                    0 days 0 hr. 0 min. 5 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/diag/tnslsnr/ps-server5/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8083)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC8083)))
Services Summary...
Service "ocp" has 1 instance(s).
  Instance "ocp", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
LSNRCTL> 

找到新的listener的位置,之后做如下操作:

1. 修改listener.ora文件

默认情况下该文件内容:

LISTENER =

(DESCRIPTION_LIST =

  (DESCRIPTION =

   (ADDRESS = (PROTOCOL = TCP)(HOST = 你的服务器IP地址)(PORT = 1521))

   (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

      ))

出现ORA-12514的问题时候,我们需要增加的服务配置:

 

SID_LIST_LISTENER = 

  (SID_LIST =

  (SID_DESC =

    GLOBAL_DBNAME =  一般和sid是一样的 )

     (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

     (SID_NAME = 自己的sid))

  )

2. 启动相关数据库和监听服务

进入 sqlplus 控制台:sqlplus /nolog

connect / as sysdba

关闭数据库:shutdown immediate

 开启数据库:startup;

退出sqlplus控制台:exit

重启oracle监听,重新用plsql连接数据库,连接成功,大功告成!

 











以上是关于linux系统中 修改oracle数据库字符集问题的主要内容,如果未能解决你的问题,请参考以下文章

英文的操作系统上可以改变oracle的字符集为中文的吗?

请问如何在Linux系统下设置字符集,命令怎么用?

如何查看和修改Oracle数据库服务器端的字符集?

linux下修改oracle数据库的字符集

linux下修改oracle数据库的字符集

linux下如何修改oracle登录密码?