环境与配置
华东 2(上海)按量倚天 ECS,规格 ecs.g8y.xlarge(4 vCPU / 16 GiB),Ubuntu 24.04 ARM,公网 IP 直连 SSH。编译 IvorySQL + make check + oracle-check 耗时 7 分 40 秒。
# 启动实例
aliyun ecs StartInstance --RegionId cn-shanghai --InstanceId <实例ID>
# SSH 连接
ssh -i ~/.ssh/id_rsa root@公网IP
代码实现:UTL_URL.ESCAPE / UNESCAPE
IvorySQL 1728(ESCAPE)和 1748(UNESCAPE)已合并。
保留字符仅 ;/?:@&=+$,。非保留字符(字母、数字、-_.!~*'())默认放行。
-- 示例
SELECT UTL_URL.ESCAPE('https://example.com/a%20b#c');
-- 预期输出:https%3A%2F%2Fexample.com%2Fa%20b%2523c
escape_reserved_chars 参数控制分隔符一起转义。Oracle 默认 false,多字节按 url_charset 转十六进制。
会话问话:SYS_CONTEXT('USERENV'...)
1936 号检查通过,但 9 月 25 日未合并。
SELECT SYS_CONTEXT('USERENV', 'SERVER') AS server;
SELECT SYS_CONTEXT('USERENV', 'INSTANCE') AS instance;
SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') AS protocol;
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS service;
- SERVER:DEDICATED(IvorySQL 每连接独立后端进程)
- INSTANCE:1
- INSTANCE_NAME / SERVICE_NAME:当前库名
- NETWORK_PROTOCOL:bequeath(本地) / tcp(网络)
性能数据与结果
| 项 | 结果 |
|---|---|
| UTL_URL.ESCAPE (1728) | 已合并 |
| UTL_URL.UNESCAPE (1748) | 已合并 |
| SYS_CONTEXT 检查 (1936) | 9 月 25 日未合并,不算成绩 |
| 编译 + make check | 249/249 通过 |
| oracle-check | 25/25 通过(UTF8) |
| 机器规格 | ecs.g8y.xlarge,Ubuntu 24.04 ARM |
| 总耗时 | 编译 2 分 30 秒(缓存),make check 249 项 7 分 40 秒 |
分期配置
实例准备
- 购买 ecs.g8y.xlarge,地域 cn-shanghai,Ubuntu 24.04 ARM
- 网络:公网 IPv4,按使用流量
- 安全组:仅放自己 IP,TCP 22
Oracle 容器部署
- Docker 拉取 Oracle XE 容器(11.2/18/21)
- 启动后确认容器可用
IvorySQL 编译
- 克隆仓库,
make make checkmake oracle-check
- 克隆仓库,
测试验证
- 连接 IvorySQL 实例
- 执行上述 SQL 查询
- 对比 Oracle 容器输出
停机
aliyun ecs StopInstance --RegionId cn-shanghai --InstanceId <ID> --StoppedMode StopCharging
常见问题
- 库编码改成 LATIN1 后,5 项检查失败(非代码错误,预期 UTF8)
- 公网 IP 下次重启地址会变,固定 IP 建议备案
(正文约 3200 字)
附录:详细配置命令
# 停止节省停机
aliyun ecs StopInstance --RegionId cn-shanghai --InstanceId <ID> --StoppedMode StopCharging
# 确认状态
aliyun ecs DescribeInstanceStatus --RegionId cn-shanghai --InstanceId <ID>
IvorySQL 编译目录下运行 make check。Oracle 用容器,实例停机时容器一起停止。