云原生数据库PolarDB(兼容Oracle)从零到一:架构解析、实战部署与Oracle语法完全指南
一、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);\nPolarDB支持的数据类型涵盖数值、字符串、日期时间、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;\nPolarDB支持的异常类型包括三种:预定义异常是内置于数据库中的命名条件,例如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操作性能。利用分区感知连接特性在连接操作时进行分区级优化。定期收集各分区的统计信息,为优化器选择最佳执行计划提供依据。




