Oracle11g 字符集 AL32UTF8 修改为ZHS16GBK
一.由于测试环境在阿里云上的docker中,
1.需要先进入容器:docker exec -it oracle11g bash
2.切换root用户:su root 并输入密码
3.软连接:sqlplus /nolog
conn as sysdba
1).如果提示 bash: sqlplus: command not found 需要重新建 ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
2).如果提示没有oracle_home配置,重载配置文件:source /home/oracle/.bash_profile
3).如果提示没有权限:cd /var/tmp chown oracle:dba .oracle
4).如果su root 密码一直错误 修改密码 docker exec -itu root oracle11g passwd
5).message file sp1<lang>.msb not found
su oracle 和 su - oracle是有区别的:
-, -l ,–login make the shell a login shell
加了”-“,是以login shell登陆的,所以会设置环境变量,如果不加,使用的还是切换前用户的环境变量,所以会出错。
echo $ORACLE_HOME 为空行
export $ORACLE_HOME=/home/app/oracle/...
二.开始修改字符集
1.SHUTDOWN IMMEDIATE;
2.STARTUP MOUNT;
3.ALTER SYSTEM ENABLE RESTRICTED SESSION;
4.ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
5.ALTER SYSTEM SET AQ_TM_PROCESSES=0;
6.ALTER DATABASE OPEN;
7.ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
8.SHUTDOWN IMMEDIATE;
9.STARTUP;
三.后续数据问题
数据库中中文乱码,处理方式:修改字符集前先导出数据库dmp备份,修改完后再导入
1.导出数据注意空表,执行脚本:select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null
2.导出AL32UTF8字符集DMP:
查询服务端字符集:select userenv('language') from dual;
修改环境变量中的HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1-->NLS_LANG-->SIMPLIFIED CHINESE_CHINA.AL32UTF8
dos中为乱码,不影响
3.导出ZHS16GBK字符集DMP:
查询服务端字符集:select userenv('language') from dual;
修改环境变量中的HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1-->NLS_LANG-->SIMPLIFIED CHINESE_CHINA.ZHS16GBK
会有EXP-00091 正在导出有问题的统计信息 警告,基本不影响数据
由于后面服务端字符集为ZHS16GBK,后面就有这个dmp数据覆盖服务器上的数据