Ubuntu 安装 Oracle 11g 数据库以及 CRUD

以下所有操作已在 Ubuntu 20.04 和 22.04 上成功复现,对于其他 Debian 系统的适用性,请自行测试。

1. 安装Oracle 11g

1.1 获取安装包

由于Oracle 11g已不受官方维护,并且官网删除了下载链接,因此需要从第三方渠道下载。经网上检索,在stackoverflow上面找到了网友分享的安装包:

alt text

Oracle 11g R2 XE 的下载地址为:https://www.iea-software.com/ftp/emeraldv5/linux/ora/oracle-xe-11.2.0-1.0.x86_64.rpm.zip

1.2 转换rpm包为deb包

由于我个人习惯使用Ubuntu 22.04 LTS,而Oracle 11g又只支持RedHat系Linux,因此在安装前需要使用alien工具将rpm包转换为deb包。以下是相关操作的命令:

1
2
3
4
5
wget https://www.iea-software.com/ftp/emeraldv5/linux/ora/oracle-xe-11.2.0-1.0.x86_64.rpm.zip  # 下载rpm包
unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip # 解压
cd Disk1 # 进入解压后的目录
sudo apt install alien # 安装alien转换工具
sudo alien --scripts -d oracle-xe-11.2.0-1.0.x86_64.rpm # 转换为deb包

转换完成后得到 oracle-xe_11.2.0-2_amd64.deb 软件包:

alt text

1.3 安装依赖及配置环境变量

安装依赖包:

1
sudo apt install -y libaio1 unixodbc

设置系统环境变量, vim 编辑 /etc/profile 文件,添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/xe; export ORACLE_HOME
ORACLE_SID=XE; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
TNS_ADMIN=$ORACLE_HOME/network/admin
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

添加 Oracle 11g 的服务, 使用 vim 编辑 /sbin/chkconfig 文件,添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# Oracle 11gR2 XE installer chkconfig hack for Ubuntu
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
echo >> $file
echo '### BEGIN INIT INFO' >> $file
echo '# Provides: OracleXE' >> $file
echo '# Required-Start: $remote_fs $syslog' >> $file
echo '# Required-Stop: $remote_fs $syslog' >> $file
echo '# Default-Start: 2 3 4 5' >> $file
echo '# Default-Stop: 0 1 6' >> $file
echo '# Short-Description: Oracle 11g Express Edition' >> $file
echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01

设置权限:

1
sudo chmod 755 /sbin/chkconfig

设置内核参数以满足 Oracle 11g 的安装和运行要求:

1
2
3
4
5
6
7
8
9
sudo sh -c 'cat >> /etc/sysctl.d/60-oracle.conf << EOF
# Oracle 11g XE kernel parameters
fs.file-max=6815744
net.ipv4.ip_local_port_range=9000 65000
kernel.sem=250 32000 100 128
kernel.shmmax=536870912
EOF'
sudo service procps start # 加载新的内核参数
sudo sysctl -q fs.file-max # 验证 fs.file-max 参数是否已经成功加载

设置挂载点以提供共享内存区域, 使用vim编辑 /etc/rc2.d/S01shm_load 文件,添加以下内容:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
case "$1" in
start) mkdir /var/lock/subsys 2>/dev/null
touch /var/lock/subsys/listener
rm /dev/shm 2>/dev/null
mkdir /dev/shm 2>/dev/null
mount -t tmpfs shmfs -o size=2048m /dev/shm ;;
*) echo error
exit 1 ;;
esac

设置权限并重启系统使设置生效:

1
2
sudo chmod 755 /etc/rc2.d/S01shm_load
reboot

1.4 安装 Oracle 11g

使用以下命令安装 Oracle 11g:

1
sudo apt install ./oracle-xe_11.2.0-2_amd64.deb

alt text

初始化配置 Oracle 11g:

1
sudo /etc/init.d/oracle-xe configure

alt text

如果需要修改初始化信息,依次执行: sudo systemctl stop oracle-xe, sudo rm /etc/default/oracle-xe, sudo /etc/init.d/oracle-xe configure

运行 Oracle 11g 并查看运行状态:

1
2
sudo systemctl start oracle-xe  # 启动服务
sudo systemctl status oracle-xe # 运行状态

alt text

2. 测试 Oracle 11g

2.1 连接 Oracle 11g

使用 SQL Plus 工具以 system 用户身份连接数据库:

1
sqlplus system  # 以 system 用户身份连接

alt text

如果提示sqlplus命令未找到,依次执行export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xeexport PATH=$ORACLE_HOME/bin:$PATH, sqlplus system

2.2 增删改查

在进行CRUD操作前,可以调整 SQL Plus 中的列格式来让输出更加整齐:

1
2
3
COLUMN id FORMAT 99999;            -- 将 id 列格式化为最多5位数字
COLUMN name FORMAT A20; -- 将 name 列格式化为20个字符
COLUMN age FORMAT 999; -- 将 age 列格式化为最多3位数字

alt text

2.2.1 创建表

Oracle 数据库在创建表的时候,并不需要提前创建数据库。

1
2
3
4
5
6
CREATE TABLE test_table (
id NUMBER(10) PRIMARY KEY, -- 主键,唯一标识
name VARCHAR2(50), -- 名字字段,最多50个字符
age NUMBER(3) -- 年龄字段,最多3位数字
);
DESC test_table; -- 查看表结构

alt text

2.2.2 插入数据

1
2
3
4
INSERT INTO test_table (id, name, age) VALUES (1, 'tsj', 21);  -- 插入第1条记录
INSERT INTO test_table (id, name, age) VALUES (2, 'mkbk', 3); -- 插入第2条记录
INSERT INTO test_table (id, name, age) VALUES (3, 'ygyg', 3); -- 插入第3条记录
SELECT * FROM test_table; -- 查看表数据

alt text

2.2.3 更新数据

1
2
3
UPDATE test_table SET name = 'sj' WHERE id = 1;  -- 更新id为1的记录,修改名字
UPDATE test_table SET age = 6 WHERE id = 2; -- 更新id为2的记录,修改年龄
SELECT * FROM test_table; -- 查看更新后的表数据

alt text

2.2.4 删除数据

1
2
3
DELETE FROM test_table WHERE id = 3;  -- 删除id为3的记录
DELETE FROM test_table WHERE age < 18; -- 删除所有年龄小于18的记录
SELECT * FROM test_table; -- 查看更新后的表数据

alt text

2.2.5 查询数据

查询所有记录:

1
2
3
4
5
-- 插入测试数据
INSERT INTO test_table (id, name, age) VALUES (2, 'mkbk', 8);
INSERT INTO test_table (id, name, age) VALUES (3, 'ygyg', 17);
-- 查询所有记录
SELECT * FROM test_table;

alt text

查询特定字段:

1
SELECT name, age FROM test_table;  -- 只查询年龄字段

alt text

使用条件过滤查询:

1
SELECT id, name FROM test_table WHERE age > 18;  -- 过滤大于18岁的结果

alt text

排序查询结果:

1
2
SELECT * FROM test_table ORDER BY age DESC;  -- 按年龄降序排序查询结果
SELECT * FROM test_table ORDER BY age ASC; -- 按年龄升序排序查询结果

alt text

使用函数查询:

1
2
3
4
5
6
7
8
9
SELECT COUNT(*) AS total_count FROM test_table;  -- 记录总数
SELECT AVG(age) AS average_age FROM test_table; -- 平均年龄
SELECT MAX(age) AS max_age FROM test_table; -- 最大年龄
SELECT MIN(age) AS min_age FROM test_table; -- 最小年龄
SELECT SUM(age) AS total_age FROM test_table; -- 年龄总和
SELECT name, LENGTH(name) AS name_length FROM test_table; -- 名字长度
SELECT UPPER(name) AS upper_name FROM test_table; -- 名字转换为大写
SELECT LOWER(name) AS lower_name FROM test_table; -- 名字转换为小写
SELECT age, COUNT(*) AS count_per_age FROM test_table GROUP BY age; -- 按年龄分组统计记录数

alt text

alt text

2.2.6 删除表

1
2
DROP TABLE test_table PURGE;  -- 删除表
SELECT * FROM test_table; -- 查看表是否存在

alt text

参考

https://stackoverflow.com/questions/60690876/how-to-download-and-install-oracle-xe-11-2-0-1-0-x86-64-rpm-zip
https://blog.csdn.net/gmaaa123/article/details/138282019