修改 Oracle XE 的CHARACTERSET


从Oracle 11g上导出一些资料至 oracle xe上时,会出现长度不足的情况。经查发现是NLS_CHARACTERSET设置不同导致的。
Oracle XE安装后,默认为AL32UTF8,这样一个中文字符会占用三个字节,而原来的数据库设置为:ZHS16GBK。以下为将Oracle XE上的AL32UTF8改为ZHS16GBK的方法:

以 sysdba 角色 进入sqlplus 之后执行以下命令:

D:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlplus.exe / as sysdbaSHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
ALTER SESSION SET SQL_TRACE=FALSE;

查看Oracle 參數

select * from v$NLS_PARAMETERS

重启数据库

SHUTDOWN IMMEDIATE;
STARTUP;

修改完成后管理界面会乱码,不用管它。

参考:修改 Oracle XE 的CHARACTERSET

Install Oracle 11gR1 x64 on CentOS


首先需要注意安装之前修改本地主机名。

  • 修改/etc/sysconfig/network文件中的HOSTNAME
  • 修改/etc/hosts中的127.0.0.1以及::1对应域名

修改完成后重启。原因是电信的DNS把localhost.localdomain指向了202.106.199.39,导致oracle em启动时不正常。

下面开始安装

创建Oracle用户及用户组

[root@localhost ~]# groupadd oinstall
[root@localhost ~]# groupadd dba
[root@localhost ~]# useradd -m -g oinstall -G dba oracle
[root@localhost ~]# passwd oracle

修改系统参数

[root@localhost ~]# vim /etc/sysctl.conf
# Oracle Install
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576[root@localhost ~]# sysctl -p

创建Oracle目录 Continue reading “Install Oracle 11gR1 x64 on CentOS”

TNS-12537: TNS:connection closed 之 Linux Error: 29: Illegal seek


出现TNS-12537: TNS:connection closed错误的原因有很多种。

我这里碰到的是域名解析的问题,详细错误日志如下:

/opt/app/oracle/product/11.1.0/db_1/bin/dbstart: Starting Oracle Net Listener

LSNRCTL for Linux: Version 11.1.0.6.0 - Production on 07-JUN-2011 08:48:45

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

Starting /opt/app/oracle/product/11.1.0/db_1/bin/tnslsnr: please wait...TNS-12537: TNS:connection closed
 TNS-12560: TNS:protocol adapter error
  TNS-00507: Connection closed
   Linux Error: 29: Illegal seek

已经在/etc/hosts中添加了127.0.0.1 localhost.localdomain,但就是无法启动Oracle 监听程序

后来执行nslookup localhost.localdomain,却发现localhost.localdomain并没有指向127.0.0.1,而是指向了202.106.199.35,真是令人惊奇。直接注释掉外网DNS服务器地址,然后重启监听服务,这次正常了。

JDBC编程中如何判断表是否存在


在java.sql包中有一个这样的接口 DatabaseMetaData接口,通过Connection.getMetaData()我们可以获得这个接口的实现。

接口中有一个getTables方法,返回ResultSet。通过getTables方法我们即可获得指定名称的表。例如:

DatabaseMetaData dmd = conn.getMetaData();
ResultSet rs = dmd.getTables(null, null, “TEST”, null);
if (rs.next) return true;// 指定的表存在

关于getTables参数的含义,大家可以参考javadoc,说得很明白。这里需要提醒的是:在Oracle中,我们使用sql的时候,表名是不区分大小写的,但是getTables中的表名必须使用大写,因为Oracle默认使用大写存储表名,否则会找不到指定的表。

ORA-06553: PLS-307: too many declarations of ‘MD5’ match this call


最近因为项目需要做两个库之间的数据交换,但是因为一些客观原因导致不能使用数据库的高级复制功能,遂想到通过两个中间库 作为数据交换的节点进行数据交换,但是这样子一来,就需要自己处理数据的更新、插入、删除判断了。

插入的数据比较好判断,通过一个表记录数据的主键即可,但是更新的数据怎么判断出来呢?通过调查发现,可以采用记录数据主键以及创建记录数据体的MD5校验码来检查数据是否被更新了。

Oracle本身提供了一个md5函数可以生成文本的md5值,连接数据执行

select dbms_obfuscation_toolkit.md5(‘test’) from dual;

居然显示ORA-06553: PLS-307: too many declarations of ‘MD5’ match this call错误,上网一查,发现需要指明接收的参数名称。通过下面的方法可以解决该问题。

select dbms_obfuscation_toolkit.md5(input_string => ‘test’) from dual;

增加了input_string类型的参数,至此问题解决。

最近决定往分布式系统架构方向走,得努力了。在卓越买了两本书,一本Java 消息服务,还有一本Spring技术内幕:深入解析Spring架构与设计原理。关于分布式,还是先从消息服务入手,然后再搞定Hadoop的配置和基本开发。Spring方面的话虽然自己一直在用,也经常看一些源代码,并且模仿Spring的设计方法在自己的系统里面做一些实现。但是没有全面的了解,感觉还是不扎实,所以看一下Spring技术内幕全盘掌握Spring的一些技术。

——谨此勉励自己

Oracle 导入exp命令导出的数据时,提示“导入提交失败”


导入提交失败
ORA-20446: The owner of the job is not registered ORA-06512: at “SYSMAN.MGMT_JOBS”, line 168 ORA-06512: at “SYSMAN.MGMT_JOBS”, line 86 ORA-06512: at line 1

最近在执行Oracle导入的过程中碰到这个问题,原因是执行JOB的账号没有相关的权限,通过下面的方法可以解决这个问题。

执行sqlplus / as sysdba

再执行
SQL> execute MGMT_USER.MAKE_EM_USER(‘需要执行导入的用户’);

PL/SQL procedure successfully completed.

这样子解决了上面的问题。