云原生数据库PolarDB(兼容Oracle)从零到一:架构解析、实战部署与Oracle语法完全指南

简介: 本文系统讲解阿里云云原生数据库PolarDB PostgreSQL版(兼容Oracle)的核心架构与实战使用。首先剖析计算存储分离的Shared Everything架构,解读一写多读集群、自动读写分离和秒级弹性扩缩容的技术原理。随后从零开始演示集群创建、网络安全配置、数据库账号权限管理及三种主流连接方式。在SQL语法部分,详细展开建表语句、NUMBER/VARCHAR2/DATE等Oracle兼容数据类型、基础DML操作、高级查询(多表连接、聚合、子查询、序列)、事务管理与隔离级别。深入讲解PL/SQL编程的完整体系:存储过程与函数创建、异常处理(预定义异常、自定义异常、PRAGMA_EXC

一、PolarDB(兼容Oracle)产品概述与技术架构

阿里云云原生数据库PolarDB PostgreSQL版(兼容Oracle)是阿里云自主研发的新一代云原生关系型数据库。该版本高度兼容Oracle语法与功能特性,支持存储过程、函数、触发器、分区表、序列、同义词等核心Oracle能力,帮助Oracle用户以极低的改造成本平滑迁移上云。PolarDB在存储计算分离架构下,利用软硬件结合的优势,提供了分钟级的配置升降级、秒级的故障恢复、全局数据一致性和免费的数据备份容灾服务。

1.1 计算存储分离的Shared Everything架构

PolarDB采用计算与存储分离的架构设计,数据库文件和Redo log等日志文件存放在共享存储设备上,主节点和所有只读副本共享同一份全量数据和增量日志数据。节点间只需要同步内存里的元数据信息,通过MVCC机制的保证,就能支持跨节点读取数据的一致性,这从根本上解决了主实例和副本之间的数据同步问题,大大节约了跨节点的网络开销,降低了副本间的同步延迟。

在具体实现层面,PolarDB的存储层采用了阿里云自主研制的分布式文件系统PolarFS。PolarFS使用全用户空间IO栈设计,具备与本地SSD硬盘相当的低延迟高性能IO能力,同时也以分布式集群的方式提供了优异的存储容量与存储性能的扩展能力。计算节点与存储节点之间通过25Gb高速RDMA网络互联,采用旁路内核的用户态网络协议层进行通讯,保证了事务和查询语句的低延迟。

1.2 一写多读集群与自动读写分离

PolarDB采用多节点集群架构,集群中有一个主节点(可读可写)和最多15个只读节点。当应用程序使用集群地址时,PolarDB通过内置的代理层PolarProxy对外提供服务。代理层不仅可以做安全认证和保护,还可以解析SQL语句,把写操作发送到主节点,把读操作均衡地分发到多个只读节点,实现自动的读写分离。PolarDB最高支持500TB存储空间,按实际使用的容量动态扩容,不影响业务的正常使用。

需要先登录阿里云控制台,点击:阿里云控制台

二、PolarDB实例创建与初始化配置

使用PolarDB的第一步是创建实例,需要在阿里云控制台完成基础配置与资源选择。

2.1 集群创建流程

登录阿里云控制台后,搜索PolarDB进入云原生数据库页面,点击创建实例。在基础配置环节,需要选择计费类型:包年包月适用于长期稳定业务,按量付费适用于业务波动较大的场景。地域和可用区应选择靠近业务的位置,优先与ECS同地域以使用内网连接降低延迟。数据库引擎必须选择PostgreSQL版(兼容Oracle),版本推荐2.0最新稳定版。网络类型选择VPC网络与交换机,确保与应用网络互通。

在资源规格选择方面,需要根据业务并发与数据量确定主节点和只读节点的规格。只读节点数量可以设置为0至15个,用于分担读压力。存储空间最小50GB,支持自动扩容,按实际使用计费。勾选服务协议后点击立即购买,等待10至15分钟完成集群创建。

2.2 网络安全配置:白名单与安全组

集群创建完成后,必须配置IP白名单和安全组以控制访问权限,保障数据库安全。设置IP白名单时,进入实例详情页,在左侧导航栏选择配置与管理中的集群白名单。点击新增IP白名单分组,输入分组名称与允许访问的IP地址。生产环境慎用0.0.0.0/0通配配置。安全组配置方面,在集群白名单页面点击选择安全组,绑定ECS所在的安全组,并确保安全组入方向放行数据库端口(默认1521),允许ECS访问数据库。

2.3 数据库账号创建与权限管理

PolarDB支持两种数据库账号类型:高权限账号和普通账号。高权限账号只能通过控制台或API创建和管理,一个集群只有一个高权限账号。普通账号可根据业务需求创建多个并按需授予不同数据库的权限。使用控制台创建的数据库账号时,该账号的HOST部分不受到限制,即白名单内的所有IP都可以访问。

2.4 连接数据库集群的三种方式

创建账号并配置白名单后,可以通过多种方式连接PolarDB集群。使用DMS(数据管理服务)是阿里云内置的Web端数据库管理工具,无需安装客户端即可执行SQL和进行数据管理。对于需要命令行操作的用户,psql客户端是最常用的工具。使用psql连接的命令格式为:psql -h 集群主地址 -p 连接端口 -u 用户名 -d 数据库名。此外,还可以使用pgAdmin等图形化管理工具进行连接。

在连接配置上,如果使用ECS访问PolarDB且两者位于同一VPC内,推荐使用私网地址以获得最佳性能。如果是在本地环境中访问PolarDB,则需要使用公网地址,但公网访问无法实现PolarDB集群的最佳性能。

三、Oracle兼容SQL语法体系详解

PolarDB PostgreSQL版(兼容Oracle)在SQL层面支持Oracle同名的数据类型,用户可以继续使用熟悉的Oracle数据类型、SQL语句和内置函数,只需极少量的代码改造。

3.1 建表语句与数据类型详解

创建表时,语法与Oracle基本一致。以下是一个简化版emp表的创建示例:

CREATE TABLE emp (\n    empno NUMBER(4),          -- 员工编号\n    ename VARCHAR2(10),       -- 员工姓名\n    job VARCHAR2(9),          -- 职位\n    mgr NUMBER(4),            -- 上级编号\n    hiredate DATE,            -- 入职日期\n    sal NUMBER(7,2),          -- 月薪\n    comm NUMBER(7,2),         -- 佣金\n    deptno NUMBER(2)          -- 部门编号\n);\n

PolarDB支持的数据类型涵盖数值、字符串、日期时间、JSON、XML、几何等多种类别。NUMBER(p,s)用于精确数值,可指定精度和小数位数,底层映射为PostgreSQL的numeric类型。VARCHAR2(n)表示变长字符串,有长度限制,底层映射为character varying。DATE类型存储日期和时间,精确到秒,在PolarDB中映射为date显示类型。如需亚秒精度,可以使用TIMESTAMP类型。针对DATE类型,如果配置参数polar_comp_redwood_date设置为true,DATE类型在表定义存储时将转换为TIMESTAMP,时间部分也与日期一起存储在列中,与Oracle的行为完全一致。

3.2 基础DML操作

插入数据使用INSERT语句:INSERT INTO emp VALUES(1001, 'GEO', 'MANAGER', NULL, DATE '2025-01-15', 5000, 500, 10);。查询数据使用SELECT语句:SELECT * FROM emp WHERE deptno = 10;。更新数据使用UPDATE语句:UPDATE emp SET sal = sal * 1.1 WHERE deptno = 20;。删除数据使用DELETE语句:DELETE FROM emp WHERE hiredate < DATE '2024-01-01';

DROP TABLE语句用于删除表:DROP TABLE tablename;。SQL的格式化规则方面,空格、制表符和换行符在语句中都有效,用户可以根据偏好自由对齐列。使用两个短横线开始注释,从注释符到行尾的内容均被忽略。除非标识符使用双引号保留大小写,否则关键字和标识符不区分大小写。

3.3 高级查询与序列同义词使用

多表连接查询使用JOIN语法:

SELECT e.ename, d.dname \nFROM emp e \nINNER JOIN dept d ON e.deptno = d.deptno \nWHERE d.loc = 'NEW YORK';\n

聚合统计使用GROUP BY和HAVING子句:

SELECT deptno, AVG(sal) as avg_sal, COUNT(*) as emp_count \nFROM emp \nGROUP BY deptno \nHAVING AVG(sal) > 3000;\n

子查询可以嵌套在WHERE条件中:SELECT ename, sal FROM emp WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = 30);

序列是Oracle数据库中的核心特性,PolarDB也完整支持。创建序列的语法为:

CREATE SEQUENCE emp_seq \n    START WITH 1000 \n    INCREMENT BY 1 \n    MAXVALUE 9999 \n    CYCLE;\n

使用序列时,通过NEXTVAL和CURRVAL伪列获取下一个值和当前值:INSERT INTO emp(empno) VALUES(emp_seq.NEXTVAL);。同义词(Synonym)为数据库对象提供别名,创建语法为:CREATE SYNONYM emp_syn FOR emp;

3.4 事务管理与隔离级别

事务通过BEGIN、COMMIT和ROLLBACK控制。默认情况下,每个单独的SQL语句都是一个自动提交的事务。需要手动控制事务时,使用BEGIN开启事务块:

BEGIN;\nUPDATE accounts SET balance = balance - 100 WHERE acc_id = 1;\nUPDATE accounts SET balance = balance + 100 WHERE acc_id = 2;\nCOMMIT;\n

发生错误时使用ROLLBACK回滚:ROLLBACK;。PolarDB支持多种事务隔离级别,包括读已提交(Read Committed)和可重复读(Repeatable Read),满足不同业务场景的一致性需求。

四、PL/SQL存储过程与函数编程

PolarDB采用SPL(Stored Procedure Language)作为过程式编程语言,用于编写自定义存储过程、函数、触发器和包。

4.1 存储过程的创建与调用

存储过程使用CREATE PROCEDURE语句创建,可以接收参数但不返回值:

CREATE OR REPLACE PROCEDURE update_salary(\n    p_empno NUMBER,\n    p_percent NUMBER\n) AS\nBEGIN\n    UPDATE emp SET sal = sal * (1 + p_percent/100)\n    WHERE empno = p_empno;\n    COMMIT;\nEND;\n

调用存储过程使用CALL关键字:CALL update_salary(1001, 10);

4.2 函数的创建与使用

函数使用CREATE FUNCTION语句创建,必须指定RETURN数据类型:

CREATE OR REPLACE FUNCTION get_annual_salary(\n    p_empno NUMBER\n) RETURN NUMBER\nAS\n    v_sal NUMBER;\nBEGIN\n    SELECT sal INTO v_sal\n    FROM emp\n    WHERE empno = p_empno;\n    RETURN v_sal * 12;\nEXCEPTION\n    WHEN NO_DATA_FOUND THEN\n        RETURN NULL;\nEND;\n

在SQL语句中调用函数:SELECT ename, get_annual_salary(empno) FROM emp;

4.3 异常处理机制详解

PolarDB同时支持PostgreSQL原生的错误处理系统和Oracle PL/SQL的异常处理模式。异常处理的完整语法结构如下:

DECLARE\n    v_result INT;\n    my_exception EXCEPTION;\n    PRAGMA EXCEPTION_INIT(my_exception, -1476);\nBEGIN\n    v_result := 1 / 0;\nEXCEPTION\n    WHEN ZERO_DIVIDE THEN\n        DBMS_OUTPUT.PUT_LINE('除零错误');\n    WHEN my_exception THEN\n        DBMS_OUTPUT.PUT_LINE('特定错误代码');\n    WHEN OTHERS THEN\n        DBMS_OUTPUT.PUT_LINE('未处理的错误');\n        DBMS_OUTPUT.PUT_LINE(SQLCODE || ' - ' || SQLERRM);\nEND;\n

PolarDB支持的异常类型包括三种:预定义异常是内置于数据库中的命名条件,例如division_by_zero(PostgreSQL风格)和zero_divide(Oracle风格);非预定义异常需要声明异常变量并通过PRAGMA EXCEPTION_INIT绑定Oracle错误代码;用户定义异常通过RAISE语句显式引发:DECLARE invalid_department EXCEPTION; BEGIN RAISE invalid_department; END;

编译错误控制方面,参数spl.max_error_count控制编译过程中SPL错误的最大容忍数量,默认为10,最大可设置为1000。

4.4 包的创建与重载

包将相关的存储过程、函数、变量和游标组织在一起。包包含包规范和包体两部分:

-- 包规范\nCREATE OR REPLACE PACKAGE emp_pkg AS\n    FUNCTION get_emp_name(p_empno NUMBER) RETURN VARCHAR2;\n    PROCEDURE hire_emp(p_ename VARCHAR2, p_sal NUMBER);\nEND emp_pkg;\n\n-- 包体\nCREATE OR REPLACE PACKAGE BODY emp_pkg AS\n    FUNCTION get_emp_name(p_empno NUMBER) RETURN VARCHAR2 IS\n        v_name VARCHAR2(100);\n    BEGIN\n        SELECT ename INTO v_name FROM emp WHERE empno = p_empno;\n        RETURN v_name;\n    END;\n    \n    PROCEDURE hire_emp(p_ename VARCHAR2, p_sal NUMBER) IS\n    BEGIN\n        INSERT INTO emp(ename, sal, hiredate) VALUES(p_ename, p_sal, SYSDATE);\n        COMMIT;\n    END;\nEND emp_pkg;\n

调用包中的元素:SELECT emp_pkg.get_emp_name(1001) FROM dual;。包支持过程与函数的名称重载,即同一个包内可以有多个同名但参数不同的函数。

五、自建Oracle迁移至PolarDB(兼容Oracle)

阿里云提供了数据传输服务DTS用于将自建Oracle迁移至PolarDB集群。迁移前需要确保自建Oracle版本为9i、10g、11g、12c、18c或19c版本,已开启ARCHIVELOG归档模式,并开启了Supplemental Logging。待迁移的表需要具备主键或非空唯一索引。

DTS支持三种迁移类型:结构迁移将迁移对象的结构定义迁移到目标PolarDB集群,支持的对象包括表、视图、同义词、触发器、存储过程、存储函数、包和自定义类型。全量数据迁移将源库所有存量数据迁移至目标库。增量数据迁移将源库在迁移过程中产生的增量数据同步至目标库,保持数据一致性。

迁移过程中需要注意:DTS在执行全量数据迁移时会占用源库和目标库一定的读写资源,可能导致数据库负载上升。建议在业务低峰期执行数据迁移,并确保源库和目标库的CPU负载在30%以下。对于迁移失败的任务,DTS会触发自动恢复,在将业务切换至目标库之前,必须停止或释放该任务。

六、分区表设计与全局索引优化

分区表是应对海量数据增长的有效手段。PolarDB支持RANGE、LIST、HASH等多种分区类型,还支持分区组合使用。创建范围分区表的示例如下:

CREATE TABLE orders (\n    order_id NUMBER,\n    order_date DATE,\n    customer_id NUMBER,\n    amount NUMBER(10,2)\n) PARTITION BY RANGE (order_date) (\n    PARTITION p202401 VALUES LESS THAN (DATE '2024-02-01'),\n    PARTITION p202402 VALUES LESS THAN (DATE '2024-03-01'),\n    PARTITION p202403 VALUES LESS THAN (DATE '2024-04-01'),\n    PARTITION p_max VALUES LESS THAN (MAXVALUE)\n);\n

分区裁剪是提升查询效率的关键特性。当查询条件包含分区键时,优化器会自动过滤掉不符合条件的分区,减少数据扫描量。PolarDB还支持动态分区裁剪特性进一步提升查询效率。全局分区索引允许DELETE和UPDATE操作按索引键定位行而不遍历全部表分区,大幅提升DML性能。

七、执行计划分析与性能优化

查询执行计划分析使用EXPLAIN命令:EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM emp WHERE deptno = 10;。执行计划输出包含表访问方式、连接类型和过滤器等关键信息,帮助定位性能瓶颈。

索引优化是数据库性能调优的核心。创建索引使用CREATE INDEX命令,但需要注意不要过度创建索引以免影响写入性能。分区策略的选择应根据数据分布和查询模式来定。对于高并发场景,事务优化至关重要,合理设置事务隔离级别可以减少锁竞争。性能监控方面,通过实时监测CPU使用率、内存占用、磁盘IO等指标,及时发现性能瓶颈并进行针对性调整。定期对数据库进行维护,如清理过期数据、优化表结构,也能持续提升性能。

PolarDB支持跨机并行查询,多个节点可以跨机并行执行SQL,充分发挥所有计算节点的硬件资源,加速分析型查询性能。在读写分离架构下,读请求自动分发到只读节点,写请求发送到主节点,通过合理分配业务流量可显著提升集群整体吞吐量。

常见问题解答

问1:PolarDB(兼容Oracle)与原生Oracle数据库在语法上有哪些主要差异?

答:PolarDB高度兼容Oracle主流语法,支持95%以上的Oracle SQL语句和PL/SQL代码。主要差异体现在:PolarDB采用计算存储分离架构,管理命令和某些系统视图名称与原生Oracle有所不同;部分Oracle专有特性如特定包(例如UTL_FILE)可能需要调整。

问2:如何从自建Oracle迁移大量数据到PolarDB?

答:推荐使用阿里云数据传输服务DTS。迁移前需要对源库开启ARCHIVELOG和Supplemental Logging,确认待迁移表具备主键或唯一索引。迁移时可选结构迁移、全量迁移和增量迁移三种类型,建议在业务低峰期执行,并提前使用ADAM进行数据库评估。

问3:PolarDB的最大存储容量是多少?扩展方式如何?

答:PolarDB PostgreSQL版(兼容Oracle)默认最高支持500TB存储空间,通过PolarStore存储层可进一步扩展至PB级。存储空间无需预先配置,根据数据量自动在线扩容,您只需为实际使用的数据量按小时付费。

问4:PL/SQL存储过程中出现编译错误如何处理?

答:可以通过调整参数spl.max_error_count来控制编译错误的容忍数量,默认为10,最大可设为1000,便于一次性看到多个错误统一修复。编译错误包括语法错误和语义错误,语义错误不会在编译时被捕获,需要在运行时排查。

问5:读写分离如何实现?需要修改应用程序代码吗?

答:PolarDB通过内置代理层PolarProxy实现自动读写分离,应用程序只需连接集群地址即可。代理层自动将写操作发送到主节点,将读操作均衡分发到只读节点,对应用程序完全透明,无需任何代码改造。

问6:如何提升分区表的查询性能?

答:使用分区裁剪特性确保查询条件包含分区键,让优化器自动过滤无关分区。创建全局分区索引(GPI)可以提升基于非分区键的DML操作性能。利用分区感知连接特性在连接操作时进行分区级优化。定期收集各分区的统计信息,为优化器选择最佳执行计划提供依据。

相关文章
|
3天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
8234 37
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
3天前
|
人工智能 运维 JavaScript
阿里云Qoder CN(原通义灵码)全解析 产品形态、版本划分与技术适配说明
在AI辅助开发与智能办公工具持续普及的当下,阿里云旗下原通义灵码正式更名为Qoder CN,同时延伸出QoderWork CN、Qoder CN CLI、Qoder CN Mobile等多款配套产品,形成覆盖代码开发、日常办公、终端交互、移动端使用的完整工具矩阵。Qoder CN核心定位为AI智能编码助手,深度适配主流代码编辑器、集成开发环境以及终端场景;QoderWork CN则偏向桌面端综合办公辅助,二者面向不同使用场景,划分了多个版本档位,搭配差异化资源配额、功能权限与计费规则,同时兼容多款主流大模型。
560 4
|
3天前
|
JavaScript 定位技术 API
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
CodeGraph 是一款爆火的本地代码智能工具,通过 tree-sitter 解析 AST 构建结构化知识图谱(存于 SQLite),为编程 Agent 提前生成“代码地图”。它显著降低 Agent 在中大型项目中的探索成本——实测工具调用减少71%、Token 降57%、速度提升46%,支持19+语言及主流框架路由识别,完全离线、无需 API Key。
527 3
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
|
3天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
3天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
690 148
|
3天前
|
人工智能 缓存 自然语言处理
阿里Qwen3.7-Max评测:Agent能力显著提升,耗时与调用成本大幅下降
阿里云百炼推出面向智能体的旗舰大模型Qwen3.7-Max,具备长周期自主执行能力,显著提升编程、办公自动化等复杂任务处理水平;支持MCP集成与多框架兼容,并以限时5折+100万Tokens免费试用大幅降低使用门槛,助力企业高效落地AI应用。在阿里云百炼平台快速体验:https://t.aliyun.com/U/fPVHqY
1922 10
|
3天前
|
存储 安全 Java
AgentScope Java 2.0:打造分布式、企业级智能体底座
AgentScope 2.0 面向分布式部署、稳定运行、权限安全等企业级需求全面升级,打造支持多租户隔离与长期稳定运行的企业级智能体底座。
|
3天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
1321 2
|
3天前
|
人工智能 运维 API
2026年阿里云百炼通义千问Qwen3.7-plus深度介绍 功能特性、使用优势及618大促订阅方案指南
大模型技术的普及,让AI能力逐步融入个人办公、内容创作、代码编写、企业运营、教育培训等各类场景。不同定位的模型对应不同使用需求,旗舰级模型性能强劲但使用成本偏高,轻量化模型价格低廉却难以胜任复杂任务,而介于两者之间的中端主力模型,凭借均衡的能力、亲民的定价、广泛的场景适配性,成为绝大多数个人用户、小型团队、中小企业的首选。
689 1
|
3天前
|
人工智能 弹性计算 运维
阿里云发布堡垒机智能运维Agent,运维交互进入自然语言新时代
支持自然语言运维,提升效率与安全双保障。
1183 1

热门文章

最新文章