首页 > 教程攻略 > ai教程 >阿里云PolarDB(兼容Oracle)从入门到精通:部署、连接与SQL语法全解

阿里云PolarDB(兼容Oracle)从入门到精通:部署、连接与SQL语法全解

来源:互联网 时间:2026-06-13 07:28:36

阿里云PolarDB(兼容Oracle)从入门到精通:部署、连接与SQL语法全解

今天要聊的是阿里云在数据库领域的一张王牌——PolarDB PostgreSQL版(兼容Oracle)。对于很多Oracle用户来说,上云最头疼的莫过于迁移成本和改造成本。而这个产品的诞生,恰恰是为了解决这个痛点。

阿里云PolarDB(兼容Oracle)从入门到精通:部署、连接与SQL语法全解

从上手到精通,这篇文章会把整个链路拆开揉碎了讲给你听。

一、PolarDB(兼容Oracle)产品概述

阿里云云原生数据库PolarDB PostgreSQL版(兼容Oracle)不是简单的数据库托管,它是阿里云自研的云原生关系型数据库,采用了存储计算分离、软硬一体化架构。简单说,既享受了分布式架构的低成本优势,又保留了集中式数据库的易用性。

最难得的是,它对Oracle语法的兼容性做得相当到位。存储过程、函数、触发器、分区表、序列、同义词这些核心特性一个不少。很多Oracle用户迁移过来,改动量小到可以忽略不计。

它的核心优势体现在这几个方面:

  • 极致兼容性

    :兼容Oracle 11g/12c主流语法,官方数据显示95%以上的Oracle SQL语句和PL/SQL代码可以无缝运行。
  • 云原生弹性

    :计算节点秒级扩缩容,存储按需扩容。业务波动大的场景,Serverless自动弹性能力非常实用。
  • 高性能低延迟

    :共享存储架构支持多节点读写分离,百万级QPS、毫秒级响应不是空话。
  • 高可用可靠

    :数据多副本强一致,自动故障转移,RTO小于30秒。业务连续性有保障。
  • 低成本运维

    :按量付费或包年包月都行,不用自建机房、不用操心硬件维护,TCO降得很明显。

说句实话,这套组合打出来,对正在考虑Oracle云迁移的团队确实有吸引力。

二、PolarDB(兼容Oracle)实例创建与初始化配置

2.1 实例创建流程

用PolarDB的第一步当然是创建实例,过程不复杂,跟着步骤走就行。

登录阿里云控制台,搜索“PolarDB”进入云原生数据库页面,点击“创建实例”。

几个关键配置点:

  • 计费类型

    :业务稳定的选包年包月,有波动的选按量付费,灵活一些。
  • 地域/可用区

    :尽量靠近业务所在地,如果跟ECS同地域,内网连接延迟最低。
  • 数据库引擎

    :选择“PostgreSQL版(兼容Oracle)”,版本推荐2.0,这是最新的稳定版。
  • 网络类型

    :选VPC网络和交换机,确保跟应用网络互通。

再看资源规格:

  • 节点规格

    :主节点和只读节点看业务并发量和数据量选,常见的有2核8G、4核16G这些配置。
  • 只读节点数量

    :从0到15个不等,读写分离场景下用来分担读压力。
  • 存储空间

    :最小50GB起步,支持自动扩容,按实际使用量计费。

勾选服务协议,点击“立即购买”,等个10到15分钟集群就创建好了。

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

实例创建完成后,第一件事就是配置访问权限,这是数据库安全的基础保障。

设置IP白名单

:在实例详情页左侧导航栏找到“配置与管理 > 集群白名单”,点击“新增IP白名单分组”。输入分组名称和允许访问的IP地址(支持单个IP、网段如192.168.1.0/24)。需要注意,0.0.0.0/0是允许所有IP,生产环境要慎用。

配置安全组

:在集群白名单页面点击“选择安全组”,绑定ECS所在的安全组,然后在安全组入方向放行数据库端口(默认1521)。

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

创建实例后需要初始化账号,这一步关系到数据库安全,不能马虎。

创建高权限账号

:在“账号管理”点击“创建账号”,输入账号名(比如admin)和强密码,账号类型选“高权限账号”。这种账号可以管理所有数据库和对象。

创建普通账号并授权

:比如创建一个app_user账号,选择需要授权的数据库,分配SELECT、INSERT、UPDATE、DELETE、CREATE TABLE等权限。支持按Schema、表级授权,遵循最小权限原则,这是保障数据安全的好习惯。

三、PolarDB(兼容Oracle)连接方式详解

PolarDB(兼容Oracle)的连接方式很丰富,内网、外网、本地客户端、JDBC、PolarPlus命令行工具都有,适配不同场景的诉求。

3.1 获取连接地址与端口

在实例详情页的“基本信息”里就能看到:

  • 内网地址

    :同地域ECS访问用这个,低延迟、高安全,生产环境首推。
  • 外网地址

    :跨地域或者本地开发调试用,需要手动开启外网访问。
  • 端口

    :默认1521,跟Oracle一致,兼容性做得很到位。

3.2 本地客户端连接(Na vicat、DBea ver)

以Na vicat Premium为例,操作很直观:打开Na vicat,点击“连接”→“Oracle”。输入连接名(自定义)、主机(内网或外网地址)、端口(1521)、服务名(polardb是默认值),还有账号密码。点击“测试连接”,成功后保存,就能操作数据库了。

3.3 PolarPlus命令行工具连接

PolarPlus是阿里云提供的兼容Oracle的命令行客户端,对熟悉命令行的DBA来说很友好。

从阿里云官网下载PolarPlus压缩包,解压就能用,不需要安装。把PolarPlus目录加入系统PATH,确保能直接执行polarplus命令。连接命令格式是:

polarplus username/password@host:1521/polardb

举个具体例子:

polarplus admin/Pw123456@pc-xxx.o.polardb.rds.aliyuncs.com:1521/polardb

连接成功后,执行SQL语句、PL/SQL块、用DESCRIBE查看表结构、EXIT退出都很顺手。

3.4 JDBC连接(Ja va应用开发)

Ja va应用通过JDBC连接PolarDB(兼容Oracle)时,驱动可以直接兼容Oracle JDBC,代码基本不用动。

Ma ven项目引入Oracle JDBC驱动(或阿里云提供的驱动)。JDBC连接URL有两种写法:

jdbc:polardb://host:1521/polardb?user=username&password=password

或者标准Oracle JDBC URL:

jdbc:oracle:thin:@host:1521:polardb

Ja va代码示例:

import ja va.sql.Connection;
import ja va.sql.DriverManager;

public class PolarDbJdbcDemo {
    public static void main(String[] args) {
        String url = "jdbc:polardb://pc-xxx.o.polardb.rds.aliyuncs.com:1521/polardb";
        String user = "admin";
        String password = "Pw123456";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            System.out.println("连接成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、Oracle到PolarDB(兼容Oracle)数据迁移

数据迁移是很多用户最关心的环节。PolarDB支持逻辑迁移、物理迁移、DTS迁移等多种方式,不同数据量对应不同方案。

4.1 逻辑迁移(小数据量,<100GB)

数据量不大的场景(百GB以内),用Oracle expdp导出、impdp导入最直接。

Oracle导出(expdp)

expdp username/password@oracle_host:1521/orcl directory=dump_dir dumpfile=oracle_data.dmp schemas=test_schema

PolarDB导入(impdp)

impdp username/password@polardb_host:1521/polardb directory=dump_dir dumpfile=oracle_data.dmp schemas=test_schema

也可以使用Na vicat或SQL Developer导出Oracle SQL脚本,在PolarDB上通过PolarPlus或Na vicat直接执行。因为语法高度兼容,基本不用修改。

4.2 DTS数据迁移(大数据量,>100GB,不停机迁移)

数据量大或者要求业务不停机迁移的场景,阿里云DTS(数据传输服务)是最优解。

创建迁移任务时,进入DTS控制台,选择“Oracle到PolarDB PostgreSQL版(兼容Oracle)”。配置源库(Oracle连接信息)和目标库(PolarDB连接信息),测试连通性。迁移类型选全量+增量迁移,既能迁移历史数据,又能同步迁移期间新增数据。

选择需要迁移的Schema、表、视图、存储过程等对象。预检查通过后启动迁移,全量完成后会自动切换到增量同步。业务切换到PolarDB后,迁移就完成了。

五、PolarDB(兼容Oracle)常用SQL语法详解

语法兼容是PolarDB的强项。DDL、DML、DQL、PL/SQL、事务控制、函数、存储过程、触发器、分区表、序列、同义词这些核心语法都支持得不错。

5.1 DDL(数据定义语言)

5.1.1 创建表(CREATE TABLE)

数据类型兼容Oracle的NUMBER、VARCHAR2、DATE、CLOB、BLOB等,主键、外键、唯一约束、非空约束、默认值都支持。

-- 创建员工表
CREATE TABLE emp (
    emp_id NUMBER(6) PRIMARY KEY,
    emp_name VARCHAR2(50) NOT NULL,
    salary NUMBER(8,2) DEFAULT 0,
    hire_date DATE DEFAULT SYSDATE,
    dept_id NUMBER(4),
    email VARCHAR2(100) UNIQUE,
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES dept(dept_id)
);

-- 创建分区表(按时间范围分区)
CREATE TABLE sales (
    sale_id NUMBER(10),
    sale_date DATE,
    amount NUMBER(10,2)
) PARTITION BY RANGE (sale_date) (
    PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
    PARTITION p2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),
    PARTITION p2025 VALUES LESS THAN (MAXVALUE)
);

5.1.2 创建索引(CREATE INDEX)

普通索引、唯一索引、函数索引、复合索引、局部索引(分区表)都支持,和Oracle的用法一样。

-- 普通索引
CREATE INDEX idx_emp_name ON emp(emp_name);

-- 唯一索引
CREATE UNIQUE INDEX idx_emp_email ON emp(email);

-- 函数索引
CREATE INDEX idx_emp_upper_name ON emp(UPPER(emp_name));

-- 复合索引
CREATE INDEX idx_emp_dept_salary ON emp(dept_id, salary);

5.1.3 创建序列(CREATE SEQUENCE)

Oracle序列语法完全兼容,用NEXTVAL和CURRVAL生成自增主键很顺手。

-- 创建员工ID序列
CREATE SEQUENCE emp_seq
START WITH 1001
INCREMENT BY 1
MINVALUE 1
NOMAXVALUE
NOCYCLE
CACHE 20;

-- 使用序列插入数据
INSERT INTO emp(emp_id, emp_name) VALUES (emp_seq.NEXTVAL, '张三');

-- 查询序列当前值
SELECT emp_seq.CURRVAL FROM DUAL;

5.1.4 创建视图/同义词(CREATE VIEW/SYNONYM)

-- 创建视图
CREATE VIEW emp_dept_view AS
SELECT e.emp_id, e.emp_name, d.dept_name
FROM emp e JOIN dept d ON e.dept_id = d.dept_id;

-- 创建同义词
CREATE SYNONYM emp_syn FOR emp;

5.2 DML(数据操作语言)

5.2.1 插入数据(INSERT)

单行插入、多行插入、查询结果插入都支持,而且是Oracle的写法。

-- 单行插入
INSERT INTO emp(emp_id, emp_name, salary, dept_id) VALUES (1001, '张三', 8000, 10);

-- 多行插入
INSERT INTO emp(emp_id, emp_name, salary, dept_id) 
VALUES (1002, '李四', 9000, 20), (1003, '王五', 7500, 10);

-- 查询结果插入
INSERT INTO emp_backup SELECT * FROM emp;

5.2.2 更新数据(UPDATE)

条件更新、关联更新、子查询更新都支持。

-- 条件更新
UPDATE emp SET salary = salary * 1.1 WHERE dept_id = 10;

-- 关联更新
UPDATE emp e SET e.salary = e.salary * 1.2 
WHERE EXISTS (SELECT 1 FROM dept d WHERE d.dept_id = e.dept_id AND d.dept_name = '技术部');

5.2.3 删除数据(DELETE/TRUNCATE)

DELETE删除指定数据可回滚,TRUNCATE清空表速度更快但不可回滚。

-- 条件删除
DELETE FROM emp WHERE salary < 5000;

-- 清空表(不可回滚)
TRUNCATE TABLE emp;

5.3 DQL(数据查询语言)

5.3.1 基础查询(SELECT)

Oracle的SELECT语法完全兼容,WHERE、ORDER BY、GROUP BY、HA VING、DISTINCT、ROWNUM、FETCH FIRST都支持。分页查询有两种写法,用ROWNUM或者FETCH FIRST都行。

-- 基础查询
SELECT emp_id, emp_name, salary FROM emp;

-- 条件查询
SELECT emp_name, salary FROM emp WHERE dept_id = 10 AND salary > 8000;

-- 排序查询
SELECT emp_name, salary FROM emp ORDER BY salary DESC, emp_name ASC;

-- 分组聚合查询
SELECT dept_id, COUNT(*) AS emp_count, A VG(salary) AS a vg_salary 
FROM emp GROUP BY dept_id HA VING A VG(salary) > 7000;

-- 去重查询
SELECT DISTINCT dept_id FROM emp;

-- 分页查询(ROWNUM)
SELECT * FROM (SELECT emp_id, emp_name, salary FROM emp ORDER BY emp_id) WHERE ROWNUM <= 10;

-- 分页查询(FETCH FIRST)
SELECT emp_id, emp_name, salary FROM emp ORDER BY emp_id FETCH FIRST 10 ROWS ONLY;

5.3.2 关联查询(JOIN)

内连接、左连接、右连接、全连接都支持,Oracle的JOIN语法直接拿来用。

-- 内连接
SELECT e.emp_id, e.emp_name, d.dept_name 
FROM emp e JOIN dept d ON e.dept_id = d.dept_id;

-- 左连接
SELECT e.emp_id, e.emp_name, d.dept_name 
FROM emp e LEFT JOIN dept d ON e.dept_id = d.dept_id;

-- 右连接
SELECT e.emp_id, e.emp_name, d.dept_name 
FROM emp e RIGHT JOIN dept d ON e.dept_id = d.dept_id;

5.3.3 子查询与集合操作

单行子查询、多行子查询、关联子查询都行。UNION、UNION ALL、INTERSECT、MINUS这些集合操作也没问题。

-- 单行子查询
SELECT emp_name, salary FROM emp WHERE salary > (SELECT A VG(salary) FROM emp);

-- 多行子查询(IN)
SELECT emp_name, dept_id FROM emp WHERE dept_id IN (SELECT dept_id FROM dept WHERE dept_name = '技术部');

-- 集合操作(UNION)
SELECT emp_id, emp_name FROM emp WHERE dept_id = 10
UNION
SELECT emp_id, emp_name FROM emp WHERE dept_id = 20;

-- 集合操作(MINUS)
SELECT emp_id FROM emp MINUS SELECT emp_id FROM emp_backup;

5.4 PL/SQL编程

5.4.1 匿名块

Oracle PL/SQL匿名块语法直接能用,变量声明、流程控制、异常处理样样在行。

DECLARE
    v_emp_name VARCHAR2(50);
    v_salary NUMBER(8,2);
BEGIN
    SELECT emp_name, salary INTO v_emp_name, v_salary FROM emp WHERE emp_id = 1001;
    DBMS_OUTPUT.PUT_LINE('员工姓名:' || v_emp_name || ',薪资:' || v_salary);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('未找到员工数据');
END;
/

5.4.2 存储过程与函数

创建、调用、删除存储过程和函数都支持,Oracle的PL/SQL开发者几乎没有学习成本。

-- 创建存储过程
CREATE PROCEDURE get_emp_info(p_emp_id NUMBER, out_emp_name OUT VARCHAR2, out_salary OUT NUMBER)
IS
BEGIN
    SELECT emp_name, salary INTO out_emp_name, out_salary FROM emp WHERE emp_id = p_emp_id;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        out_emp_name := NULL;
        out_salary := NULL;
END;
/

-- 调用存储过程
DECLARE
    v_name VARCHAR2(50);
    v_sal NUMBER(8,2);
BEGIN
    get_emp_info(1001, v_name, v_sal);
    DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || ',薪资:' || v_sal);
END;
/

-- 创建函数
CREATE FUNCTION get_a vg_salary(p_dept_id NUMBER) RETURN NUMBER
IS
    v_a vg_sal NUMBER(8,2);
BEGIN
    SELECT A VG(salary) INTO v_a vg_sal FROM emp WHERE dept_id = p_dept_id;
    RETURN v_a vg_sal;
END;
/

-- 调用函数
SELECT get_a vg_salary(10) FROM DUAL;

5.4.3 触发器

行级触发器、语句级触发器、DDL触发器都支持,Oracle触发器语法直接可用。

-- 创建行级触发器(插入员工后自动记录日志)
CREATE TRIGGER emp_after_insert
AFTER INSERT ON emp
FOR EACH ROW
BEGIN
    INSERT INTO emp_log(emp_id, emp_name, op_time, op_type)
    VALUES (:NEW.emp_id, :NEW.emp_name, SYSDATE, 'INSERT');
END;
/

5.5 事务管理

ACID事务特性完全支持,COMMIT、ROLLBACK、SA VEPOINT、自治事务一个不少。

5.5.1 基础事务

-- 事务提交
BEGIN
    INSERT INTO emp(emp_id, emp_name) VALUES (1004, '赵六');
    UPDATE emp SET salary = 8500 WHERE emp_id = 1004;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END;
/

5.5.2 保存点(SA VEPOINT)

-- 保存点与回滚
BEGIN
    INSERT INTO emp(emp_id, emp_name) VALUES (1005, '钱七');
    SA VEPOINT sp1;
    UPDATE emp SET salary = 9000 WHERE emp_id = 1005;
    ROLLBACK TO sp1; -- 回滚到保存点,撤销更新操作
    COMMIT; -- 提交插入操作
END;
/

5.5.3 自治事务

自治事务这个特性很实用,它独立于主事务,提交或回滚不影响主事务,日志记录场景特别适合。

-- 创建自治事务存储过程
CREATE PROCEDURE log_operation(p_msg VARCHAR2)
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO operation_log(log_msg, log_time) VALUES (p_msg, SYSDATE);
    COMMIT;
END;
/

-- 主事务调用自治事务
BEGIN
    INSERT INTO emp(emp_id, emp_name) VALUES (1006, '孙八');
    log_operation('插入员工孙八'); -- 自治事务提交,主事务回滚后日志仍保留
    ROLLBACK;
END;
/

5.6 常用Oracle兼容函数

PolarDB对Oracle内置函数的支持很全面,字符串函数、日期函数、聚合函数、转换函数一应俱全。

-- 字符串函数
SELECT CONCAT('Hello', 'World') FROM DUAL;
SELECT SUBSTR('PolarDB', 1, 3) FROM DUAL;
SELECT UPPER('polardb') FROM DUAL;
SELECT LOWER('POLARDB') FROM DUAL;
SELECT LENGTH('PolarDB') FROM DUAL;

-- 日期函数
SELECT SYSDATE FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
SELECT TO_DATE('2025-01-01', 'YYYY-MM-DD') FROM DUAL;
SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL;
SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2025-01-01', 'YYYY-MM-DD')) FROM DUAL;

-- 转换函数
SELECT TO_NUMBER('12345') FROM DUAL;
SELECT TO_CHAR(12345) FROM DUAL;
SELECT CAST('123' AS NUMBER) FROM DUAL;

-- 条件函数
SELECT DECODE(dept_id, 10, '技术部', 20, '市场部', '其他部门') FROM emp;
SELECT CASE WHEN salary > 10000 THEN '高薪' WHEN salary > 8000 THEN '中薪' ELSE '底薪' END FROM emp;

六、PolarDB(兼容Oracle)与Oracle兼容性差异及注意事项

虽然兼容性很高,但不可能做到100%。了解这些差异点,迁移时能少踩很多坑。

6.1 数据类型差异

INTEGER类型是个需要注意的地方。Oracle里INTEGER等价于NUMBER(38),范围很大。但PolarDB中INTEGER是32位整型,范围是-2^31到2^31-1。如果超出这个范围,需要用NUMBER(38)替代。

Oracle的LONG类型支持长文本,PolarDB建议用CLOB替代,兼容性更好。

6.2 语法差异

PolarDB的保留关键字如果用做标识符,需要用双引号包裹。比如"ORDER"。

层级查询的CONNECT BY语法,基本支持,但CONNECT_BY_ROOT这类高级特性需要2.0及以上版本才支持。

外部表功能通过oracle_fdw插件实现,使用时需要手动创建插件和用户映射。

6.3 性能注意事项

分区表建议创建局部索引,避免全局索引的维护开销。

SQL层面,避免SELECT *,指定字段名能让查询更高效。ROWNUM分页的写法要注意合理使用,避免全表扫描。

事务隔离级别默认是READ COMMITTED,高并发场景下可以调整为SERIALIZABLE。

七、PolarDB(兼容Oracle)运维与优化

7.1 备份与恢复

自动备份默认开启,可以设置备份时间和保留天数(7到30天)。手动备份在控制台一键创建全量备份,适合数据归档或迁移场景。时间点恢复功能基于备份和日志,可以恢复到任意时间点,还支持跨地域恢复。

7.2 监控与告警

控制台的监控指标很全面——CPU使用率、内存使用率、磁盘IO、连接数、查询响应时间、锁等待等。支持自定义告警规则,异常时通过信息或邮件通知。

7.3 性能优化

读写分离

:添加只读节点分担读压力,查询性能提升很明显。

参数调优

:shared_buffers、work_mem、max_connections这些参数可以根据业务负载调整。

SQL优化

:用EXPLAIN分析执行计划,优化慢查询。索引要合理创建,避免索引失效造成性能下降。

八、总结

阿里云PolarDB PostgreSQL版(兼容Oracle)对Oracle用户来说,是上云的一个理想选择。云原生弹性、高性能高可用、Oracle高度兼容,这些特质组合在一起,确实能把迁移改造成本降得很低。

这篇文章从实例创建、网络配置到连接方式、数据迁移,再到常用SQL语法、兼容性差异、运维优化,覆盖了从入门到精通的全流程。希望它能帮你快速上手PolarDB(兼容Oracle),高效支撑业务系统。

九、常见问答

Q1:PolarDB(兼容Oracle)是否完全兼容Oracle所有语法?


A1:兼容Oracle 11g/12c主流语法,95%以上常用SQL与PL/SQL代码可以直接运行。少量高级语法(比如部分层级查询、特殊系统视图)存在差异,迁移前建议做兼容性评估。

Q2:Oracle迁移到PolarDB(兼容Oracle)需要修改大量代码吗?


A2:大部分Oracle SQL和PL/SQL代码可以直接运行,仅需调整少量数据类型(如INTEGER)、关键字、外部表等差异部分。改造成本极低,这是很多用户没想到的惊喜。

Q3:PolarDB(兼容Oracle)支持读写分离吗?


A3:支持。可以添加1到15个只读节点,控制台开启读写分离后,读请求自动分发到只读节点,写请求发给主节点,并发性能提升很明显。

Q4:PolarDB(兼容Oracle)的备份数据可以恢复到本地Oracle吗?


A4:不可以。PolarDB备份格式是自研的,仅支持在PolarDB集群间恢复。如果需要迁移到本地Oracle,可以通过DTS或者逻辑导出(expdp/impdp)方式实现。

Q5:PolarDB(兼容Oracle)的连接端口是什么?


A5:默认端口是1521,跟Oracle一致。端口可以在控制台修改,连接时需要确保白名单和安全组放行了对应端口。

Q6:PolarDB(兼容Oracle)支持Serverless自动弹性吗?


A6:支持。Serverless集群可以设置只读节点伸缩上下限和单节点PCU扩缩范围,系统会自动根据负载调整资源,适配业务波动还能降低成本。