Oracle数据库迁移 GBK-->UTF8

1.数据库生僻字改造源数据库业务数据字段调整

1.1.修改需求

  随着业务的发展及信息化的应用更加广泛,所存储的文字范围越来越广,目前的很多ZHS16GBK的字符编码的数据库已经不能完全满足信息系统对于信息存储的要求,而急需将现有ZHS16GBK的字符编码的数据库进行改造,改造成可以支持更广泛信息存储的AL32UTF8的字符编码。
针对生僻字的改造的因为是逻辑层面,通常通过逻辑层面解决。
因为业务数据以不同的数据库字符集存储的时候占用空间不一样,同样的业务数据以AL32UTF8字符集存储的时候理论上会比以ZHS16GBK字符集多占用50%空间,我们统一调整源数据库的字符类型字段长度为2000以下的的业务数据为原来的2倍大小,2000以上字段长度统一调整为4000大小。

1.2.修改方法

  通过执行脚本一键修改某个用户表字段为CHAR, NCHAR, NVARCHAR2, VARCHAR, VARCHAR2长度为当前长度2倍。
如果字段长度小于2000,则修改为2倍,如果字段长度大于或等于2000,则修改为4000。

1.3.参考脚本

  通过数据库业务用户生成修改业务字段的SQL,脚本如下:

user_col_leng_alter.sh

#!/bin/bash

basedir=$(cd $(dirname basename); pwd)

read -p 'Oracle Database user: ' SCHEMA_NAME
read -p 'Oracle Database password: ' PASSWORD

ORACLE_SID=orcl1
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

PATH=$ORACLE_HOME/bin:$PATH

sqltmp1=${basedir}/alter_col_length.tmp
sqltmp2=${basedir}/alter_col_length_2000.tmp
sqlfile1=${basedir}/alter_col_length.sql
sqlfile2=${basedir}/alter_col_length_2000.sql
logfile1=${basedir}/alter_col_length_`date +%Y-%m-%d`.log
logfile2=${basedir}/alter_col_length_2000_`date +%Y-%m-%d`.log
echo > ${sqltmp1}
echo > ${sqltmp2}
echo > ${logfile1}
echo > ${logfile2}

sqlplus -s ${SCHEMA_NAME}/${PASSWORD} <<EOF
set linesize 200
set pagesize 0
spool ${sqltmp1}
select 'alter table ' || table_name || ' modify ' || column_name || ' ' ||
       data_type || '(' || data_length * 2 || ') --' || data_type || '(' ||
       data_length || ');'
  from user_tab_columns
 where data_type in ('CHAR', 'NCHAR', 'NVARCHAR2', 'VARCHAR', 'VARCHAR2')
   and data_length < 2000
 order by table_name, column_name;

spool off
exit
EOF

sleep 1
grep '^alter' ${sqltmp1} > ${sqlfile1}


sqlplus -s ${SCHEMA_NAME}/${PASSWORD} <<EOF
set linesize 200
set pagesize 0
spool ${sqltmp2}
select 'alter table ' || table_name || ' modify ' || column_name || ' ' ||
       data_type || '(4000) --' || data_type || '(' || data_length || ');'
  from user_tab_columns
 where data_type in ('CHAR', 'NCHAR', 'NVARCHAR2', 'VARCHAR', 'VARCHAR2')
   and data_length between 2000 and 3999
 order by table_name, column_name;

spool off
exit
EOF

sleep 1
grep '^alter' ${sqltmp2} > ${sqlfile2}

echo 
echo "Check result file ${sqlfile1}"
echo "Check result file ${sqlfile2}"
echo

sqlplus ${SCHEMA_NAME}/${PASSWORD} <<EOF
set linesize 200
set pagesize 0
set verify on
set echo on
spool ${logfile1}
@${sqlfile1}
spool off
spool ${logfile2}
@${sqlfile2}
spool off
exit
EOF

1.4.脚本使用方法

  使用oracle用户执行如下脚本,脚本会提示输入需要修改字段的用户名、密码,输入相应用户、密码。如果有多个用户需要执行多次脚本。如果数据库主机上有多个实例,需注意切换实例名。
sh ./user_col_leng_alter.sh

工作中整理的 侵权删

Oracle数据库从ZHS16GBK字符集迁移UTF8字符集需要经过以下步骤: 1. 确认数据库版本和字符集 在迁移前,需要确认数据库版本和当前使用的字符集。可以使用以下命令查询: ``` SELECT * FROM v$version; SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%'; ``` 2. 备份数据库 在进行任何操作前,一定要备份数据库以防止数据丢失。 3. 准备新的数据库 创建一个新的Oracle数据库,使用UTF8字符集。 4. 导出数据 使用Oracle自带的数据导出工具exp进行数据导出。在导出时,需要将字符集设置为ZHS16GBK,以保证数据正确导出。例如: ``` exp userid=system/manager file=mydb.dmp log=mydb.log \ CONSISTENT=Y DIRECT=Y ROWS=Y \ BUFFER=1048576 RECORDLENGTH=65535 \ CHARSET=ZHS16GBK ``` 5. 转换数据 将导出的数据文件中的字符集从ZHS16GBK转换为UTF8。可以使用iconv等工具进行转换。 6. 导入数据 使用Oracle自带的数据导入工具imp将转换后的数据导入到新的数据库中。在导入时,需要将字符集设置为UTF8,以保证数据正确导入。例如: ``` imp userid=system/manager file=mydb_utf8.dmp log=mydb_utf8.log \ FULL=Y IGNORE=Y \ BUFFER=1048576 ROWS=Y \ CHARSET=UTF8 ``` 7. 修改字符集 在数据导入完成后,需要修改新数据库的字符集为UTF8。可以使用以下命令进行修改: ``` ALTER DATABASE CHARACTER SET UTF8; ``` 8. 检查数据 完成以上步骤后,需要检查数据是否正确迁移。可以使用以下命令检查: ``` SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%'; ``` 同时,还需要进行一些其他的检查,例如检查数据是否乱码等。若有问题,需要及时处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值