最近公司要在一台Ubuntu服务器上装Oracle2C,很多坑,在这里跟大家分享一下
一、远程桌面
1.图形化界面问题
因为Oracle安装必须使用界面安装形式,此Ubuntu系统是在阿里云上的,目前只能使用Xshell连接,所以必须先解决图形化界面的问题。
我选择的是Xmanager
具体怎么使用,网上的说法不一,我亲测的一个方法有效:
(1)先安装gnome,执行以下命令:
gnome桌面窗口管理程序
sudo apt-get install gnome-shell
安装gnome面板
sudo apt-get install gnome-panel
安装gnome菜单
sudo apt-get install gnome-menus
安装gnome-session
sudo apt-get install gnome-session
安装gdm会话切换器
sudo apt-get install gdm
(2)然后启动Xmanager 新建 Xstart 会话
注意:
在创建会话之前要确保Xshell连接时保证隧道可以转发到Xmanager:
接下来就可以创建Xstart会话了:
输入连接参数,以及命令 /usr/bin/gnome-panel --display $DISPLAY
这个时候出现了一个错误:xhost: unable to open display
(这里我在网上找了一下,大家出的错误不大一样,但是大体都是xhost错误,但是并没有找到合适的解决方式),
试着执行 xhost +
为所有用户授权,并不可行。
然后试着 xhost + ip
还是不行
然后尝试重新安装 xterm
sudo apt-get install xterm
安装完成以后,使用命令 :
export DISPLAY=:1.0 (注意这里不是 DISPLAY=:0.0)
再执行:
xhost +
查看输出:access control disabled, clients can connect from any host
好了,授权成功。
然后就可以看到图形界面了,我的图形界面不知道因为什么原因无法看到主体,不过不要紧,按如下点击即可进入文件系统:
点击左上角Ubuntu的图标 > Accessories >Files >Computer
至此,图形化界面可以正常使用
二、系统变量
1.首先要执行两行命令先进行更新,不然会404错误;
sudo apt-get update
sudo apt-get upgrade
2.安装依赖包
sudo apt-get install bzip2
sudo apt-get install elfutils
sudo apt-get install automake
sudo apt-get install autotools-dev
sudo apt-get install binutils
sudo apt-get install expat
sudo apt-get install gawk
sudo apt-get install gcc
sudo apt-get install gcc-multilib
sudo apt-get install g+±multilib
sudo apt-get install ia32-libs
sudo apt-get install ksh
sudo apt-get install less
sudo apt-get install lesstif2
sudo apt-get install lesstif2-dev
sudo apt-get install lib32z1
sudo apt-get install libaio1
sudo apt-get install libaio-dev
sudo apt-get install libc6-dev
sudo apt-get install libc6-dev-i386
sudo apt-get install libc6-i386
sudo apt-get install libelf-dev
sudo apt-get install libltdl-dev
sudo apt-get install libmotif4
sudo apt-get install libodbcinstq4-1 libodbcinstq4-1:i386
sudo apt-get install libpth-dev
sudo apt-get install libpthread-stubs0
sudo apt-get install libpthread-stubs0-dev
sudo apt-get install libstdc++5
sudo apt-get install lsb-cxx
sudo apt-get install make
sudo apt-get install openssh-server
sudo apt-get install pdksh
sudo apt-get install rlwrap
sudo apt-get install rpm
sudo apt-get install sysstat
sudo apt-get install unixodbc
sudo apt-get install unixodbc-dev
sudo apt-get install unzip
sudo apt-get install x11-utils
sudo apt-get install zlibc
3.检查系统变量
sudo /sbin/sysctl -a | grep sem
sudo /sbin/sysctl -a | grep shm
sudo /sbin/sysctl -a | grep file-max
sudo /sbin/sysctl -a | grep aio-max
sudo /sbin/sysctl -a | grep ip_local_port_range
sudo /sbin/sysctl -a | grep rmem_default
sudo /sbin/sysctl -a | grep rmem_max
sudo /sbin/sysctl -a | grep wmem_default
sudo /sbin/sysctl -a | grep wmem_max
上面每一行命令都会查出对应的变量值,修改sysctl.conf 文件,将对应的数值填进去
vi /etc/sysctl.conf
输入如下,将上面每一条查出的数据找到对应的名字写进去就好
fs.aio-max-nr = ?
fs.file-max = ?
kernel.shmall = ?
kernel.shmmax = ?
kernel.shmmni = ?
kernel.sem = ?
net.ipv4.ip_local_port_range = ?
net.core.rmem_default = ?
net.core.rmem_max = ?
net.core.wmem_default = ?
net.core.wmem_max = ?
运行一下命令更新内核参数
sudo sysctl -p
4.添加对当前用户的内核限制在 /etc/security/limits.conf 文件中增加以下数据(XXX为你当前用户名)
XXX soft nproc 2047
XXX hard nproc 16384
XXX soft nofile 1024
XXX hard nofile 65536
XXX soft stack 10240
5.检查/etc/pam.d/login,增加以下行(有了就不用增加了):
session required pam_limits.so
6.检查/etc/pam.d/su,没有以下行就自己加上:
session required pam_limits.so
7.oracle默认不支持ubuntu需要欺骗一下oracle安装程序,执行以下命令:
sudo mkdir /usr/lib64 sudo ln -s /etc /etc/rc.d
sudo ln -s /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib64/
sudo ln -s /usr/bin/awk /bin/awk
sudo ln -s /usr/bin/basename /bin/basename
sudo ln -s /usr/bin/rpm /bin/rpm
sudo ln -s /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64/
sudo ln -s /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a /usr/lib64/ sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /lib64/
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64/
8.配置oracle的环境变量
sudo gedit ~/.profile (注意这里不是 .bash_profile,没有安装gedit的话用 vi命令也可以)
export ORACLE_BASE=/home/xxx/app/xxx
export ORACLE_HOME=
O
R
A
C
L
E
B
A
S
E
/
p
r
o
d
u
c
t
/
11.2.0
/
d
b
h
o
m
e
1
e
x
p
o
r
t
O
R
A
C
L
E
S
I
D
=
o
r
c
l
e
x
p
o
r
t
O
R
A
C
L
E
U
N
Q
N
A
M
E
=
o
r
c
l
e
x
p
o
r
t
P
A
T
H
=
{ORACLE_BASE}/product/11.2.0/dbhome_1 export ORACLE_SID=orcl export ORACLE_UNQNAME=orcl export PATH=
ORACLEBASE/product/11.2.0/dbhome1exportORACLESID=orclexportORACLEUNQNAME=orclexportPATH=PATH:${ORACLE_HOME}/bin/;
修改以后使用 source命令使其生效 : source ~/.profile
具体oracle2C的安装过程,这里不再赘述,我分享的资源 《linux+weblogic+jdk+Oracle2C环境搭建》 中写的很详细,当然如果不想用积分下载的话,可以自己百度一下,有很多的例子
三、安装注意事项:
如果安装时报如下错误:
请不要使用root用户跳转到oracle,即使是使用 oracle变量也不行,必须重启一个链接,使用oracle用户直接登录
四、安装以后注意事项
1.乱码问题
安装完成以后,打开客户端连接数据库,发现中文乱码,首先查看ubuntu系统变量NLS_LANG 是否正确,如果正确,sql查看当前的使用编码格式 ,
select userenv(‘language’) from dual;
如果与NLS_LANG不相符,则需要进行修改:
SQL> shutdown immediate
SQL> startup nomount
SQL> alter database mount exclusive; --装载数据为专用的高级模式;
SQL> alter system enable restricted session; --启用受限制的session模式
SQL> alter system set job_queue_processes=0; --‘maximum number of job queue slave processes’ 设置工作队列的最大进程数为0
SQL> alter system set aq_tm_processes=0;
SQL> alter database open;
SQL> alter database character set INTERNAL_USE AL32UTF8; --新的字符集必须支持旧的字符集(旧字符集的超集),
SQL> shutdown immediate
SQL> startup
再次打开客户端,进行表重新导入即可。
2.“WM_CONCAT”: 标识符无效问题
因为12C已经舍弃了 WM_CONCAT 函数,这时候项目中的一些代码就会报错,用以下方式解决:
(1)解锁sys用户
alter user sys account unlock;
(2)创建包,包体,函数
以sys用户登录数据库,执行下面的命令
CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT
(
CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2) RETURN NUMBER,MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)RETURN NUMBER,MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
);
定义类型body:
CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPLISSTATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)RETURN NUMBERISBEGIN
SCTX := WM_CONCAT_IMPL(NULL) ;
RETURN ODCICONST.SUCCESS;END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)
RETURN NUMBER
ISBEGINIF(CURR_STR IS NOT NULL) THEN
CURR_STR := CURR_STR || ‘,’ || P1;
ELSE
CURR_STR := P1;END IF;
RETURN ODCICONST.SUCCESS;END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
ISBEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)
RETURN NUMBER
ISBEGINIF(SCTX2.CURR_STR IS NOT NULL) THEN
SELF.CURR_STR := SELF.CURR_STR || ‘,’ || SCTX2.CURR_STR ;END IF;
RETURN ODCICONST.SUCCESS;END;END;
自定义函数:自定义行变列函数:
CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
(3)创建同义词并授权
create public synonym WM_CONCAT_IMPL for sys.WM_CONCAT_IMPLcreate public synonym wm_concat for sys.wm_concatgrant execute on WM_CONCAT_IMPL to publicgrant execute on wm_concat to public