Oracle数据库管理系统中,创建多个数据库是一项复杂但常见的任务,Oracle数据库的架构与其他数据库系统有所不同,它采用了一个容器数据库(Container Database, CDB)和可插拔数据库(Pluggable Database, PDB)的概念,从Oracle 12c开始,引入了多租户架构,使得在一个容器数据库中创建多个可插拔数据库变得更加方便和高效,下面将详细介绍如何在Oracle中创建多个数据库。
准备工作
在开始创建多个数据库之前,需要确保以下几点:
- 安装Oracle数据库软件:确保已经安装了Oracle数据库软件,并且具备足够的权限来创建和管理数据库。
- 创建容器数据库(CDB):在Oracle 12c及以上版本中,首先需要创建一个容器数据库,然后在其中创建可插拔数据库。
- 权限设置:确保你具有SYSDBA或类似权限,以便执行数据库创建和管理操作。
创建容器数据库(CDB)
-
使用DBCA创建CDB:
- 打开Oracle的数据库配置助手(Database Configuration Assistant, DBCA)。
- 选择“创建数据库”选项。
- 在数据库模板中选择“一般用途/事务处理”或根据需求选择合适的模板。
- 输入全局数据库名称(Global Database Name),例如
CDB1。 - 设置管理员密码(如SYS、SYSTEM用户的密码)。
- 在“存储选项”中,选择适当的存储类型和位置。
- 在“初始化参数”中,可以调整内存分配、归档日志等设置。
- 完成向导,点击“创建”按钮,DBCA将自动创建容器数据库。
-
验证CDB的创建:
- 使用SQLPlus或其他工具连接到新创建的CDB。
- 运行以下命令以确认CDB已成功创建:
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;
这将显示当前CDB中的所有PDB及其状态。
创建可插拔数据库(PDB)
在容器数据库创建完成后,可以在其中创建多个可插拔数据库,以下是几种常用的方法:
使用图形界面(DBCA)
-
打开DBCA:
- 再次启动Database Configuration Assistant。
- 选择“配置数据库选项”。
-
选择容器数据库:
- 在“选择数据库”页面,选择刚刚创建的容器数据库(如
CDB1)。 - 点击“下一步”。
- 在“选择数据库”页面,选择刚刚创建的容器数据库(如
-
创建PDB:
- 在“操作”页面,选择“创建可插拔数据库”。
- 输入PDB的名称,例如
PDB1。 - 设置PDB的管理员密码。
- 选择PDB的字符集、表空间等选项。
- 点击“完成”,DBCA将自动在CDB中创建新的PDB。
-
重复步骤:
- 按照上述步骤,可以继续创建更多的PDB,如
PDB2、PDB3等。
- 按照上述步骤,可以继续创建更多的PDB,如
使用命令行(SQLPlus)
-
连接到CDB:
- 打开SQLPlus,使用SYSDBA权限连接到CDB:
sqlplus / as sysdba
- 打开SQLPlus,使用SYSDBA权限连接到CDB:
-
创建PDB:
- 使用
CREATE PLUGGABLE DATABASE语句创建新的PDB,创建名为PDB1的数据库:SQL> CREATE PLUGGABLE DATABASE PDB1 ADMIN USER pdbadmin IDENTIFIED BY password123 2 ROLE DEFAULT ALLOW FULL ACCESS ON THIS CONTAINER;
这里,
pdbadmin是PDB的管理员用户,password123是其密码。
- 使用
-
打开PDB:
- 创建完成后,需要打开PDB以供使用:
SQL> ALTER PLUGGABLE DATABASE PDB1 OPEN;
- 创建完成后,需要打开PDB以供使用:
-
重复创建:
- 通过修改PDB名称和管理员信息,可以创建多个PDB。
SQL> CREATE PLUGGABLE DATABASE PDB2 ADMIN USER pdbadmin2 IDENTIFIED BY password456 2 ROLE DEFAULT ALLOW FULL ACCESS ON THIS CONTAINER; SQL> ALTER PLUGGABLE DATABASE PDB2 OPEN;
- 通过修改PDB名称和管理员信息,可以创建多个PDB。
使用脚本自动化创建
对于需要批量创建多个PDB的情况,可以编写脚本来自动化这一过程,以下是一个示例脚本:
#!/bin/bash
# 定义变量
CDB_NAME="CDB1"
PASSWORD="password123"
ADMIN_PREFIX="pdbadmin"
# 循环创建多个PDB
for i in {1..5}
do
PDB_NAME="PDB$i"
ADMIN_USER="${ADMIN_PREFIX}$i"
echo "Creating PDB: $PDB_NAME with admin user: $ADMIN_USER"
sqlplus -s / as sysdba <<EOF
CREATE PLUGGABLE DATABASE $PDB_NAME ADMIN USER $ADMIN_USER IDENTIFIED BY $PASSWORD
ROLE DEFAULT ALLOW FULL ACCESS ON THIS CONTAINER;
ALTER PLUGGABLE DATABASE $PDB_NAME OPEN;
EOF
done
echo "All PDBs created successfully."
将上述脚本保存为create_pdbs.sh,并赋予执行权限:
chmod +x create_pdbs.sh
然后运行脚本:
./create_pdbs.sh
该脚本将在CDB中创建5个PDB,每个PDB都有独立的管理员用户和密码。
管理和维护多个PDB
创建多个PDB后,需要对其进行有效的管理和维护,以下是一些关键操作:
-
查看PDB状态:
- 使用以下命令查看所有PDB的状态:
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;
输出示例如下:
| NAME | OPEN_MODE |
|——-|———–|
| PDB1 | READ WRITE |
| PDB2 | MOUNTED |
| PDB3 | READ WRITE |
- 使用以下命令查看所有PDB的状态:
-
启动和关闭PDB:
- 启动PDB:
SQL> ALTER PLUGGABLE DATABASE PDB1 OPEN;
- 关闭PDB:
SQL> ALTER PLUGGABLE DATABASE PDB1 CLOSE IMMEDIATE;
- 注意:关闭CDB时,所有PDB也会随之关闭。
- 启动PDB:
-
备份和恢复:
- 可以使用RMAN(Recovery Manager)对整个CDB进行备份,包括其中的所有PDB,也可以针对单个PDB进行备份和恢复。
- 示例备份命令:
rman target / RMAN> BACKUP CDB INCLUDING CURRENT CONTROLFILE;
- 示例恢复命令:
rman target / RMAN> RECOVER CDB;
-
资源管理:
- 使用资源管理器(Resource Manager)来限制每个PDB的资源使用,如CPU、内存等,以确保各个PDB之间的资源公平分配。
- 配置资源计划示例:
SQL> BEGIN 2 DBMS_RESOURCE_MANAGER.CREATE_PLAN('my_plan'); 3 DBMS_RESOURCE_MANAGER.SET_CONTROL('my_plan', 'UNDO_POOL', 'UNDO_ANY'); 4 DBMS_RESOURCE_MANAGER.SET_CONTROL('my_plan', 'CPU_P1', 'CPU_LIMIT', 80); 5 DBMS_RESOURCE_MANAGER.SET_CONTROL('my_plan', 'CPU_P2', 'CPU_LIMIT', 60); 6 DBMS_RESOURCE_MANAGER.ACTIVATE_PLAN('my_plan'); 7 END;
-
监控和性能调优:
- 使用Oracle Enterprise Manager(OEM)或其他监控工具来实时监控各个PDB的性能指标,如会话数、事务量、I/O活动等。
- 根据监控数据,调整初始化参数、优化SQL语句、增加索引等,以提升整体性能。
常见问题及解决方案
无法创建PDB,提示“ORA-00604: error occurred at recursive SQL level 1”
原因分析:此错误通常与系统权限或配置有关,可能是由于缺乏必要的权限或参数设置不当导致的。
解决方案:
- 检查用户权限:确保当前用户具有SYSDBA权限,或者以SYS用户身份连接。
- 验证初始化参数:检查与PDB创建相关的初始化参数,如
pdb_name、pdb_admin等是否正确设置。 - 查看详细错误信息:通过查看alert日志或使用
SHOW ERROR命令获取更详细的错误信息,以便进一步诊断问题。 - 重启数据库实例:有时重启数据库实例可以解决临时的配置或资源问题。
- 参考官方文档:查阅Oracle官方文档中的相关章节,确保遵循正确的步骤和最佳实践。
如何在不同PDB之间迁移数据?
原因分析:在某些场景下,可能需要将数据从一个PDB迁移到另一个PDB,例如进行数据隔离、测试或负载均衡。
解决方案:
- 使用导出导入(Data Pump):这是最常用的方法之一,首先在源PDB中导出数据,然后在目标PDB中导入数据,具体步骤如下:
- 导出数据:
expdp source_user/source_password@source_pdb schemas=schema_name directory=exp_dir dumpfile=exp.dmp logfile=exp.log
- 导入数据:
impdp target_user/target_password@target_pdb schemas=schema_name directory=imp_dir dumpfile=exp.dmp logfile=imp.log remap_schema=source_schema:target_schema
- 导出数据:
- 使用传输表空间(Transportable Tablespaces):适用于大规模数据迁移,尤其是包含大量数据的表空间,步骤包括在源PDB中导出表空间元数据和数据文件,然后在目标PDB中导入这些文件,需要注意的是,目标PDB的表空间名称和结构必须与源PDB一致。
- 利用闪回复制(Flashback Replication):这是一种基于日志的复制技术,可以实现近乎实时的数据同步,通过设置闪回日志和快照,可以在不同PDB之间保持数据的一致性,但这种方法较为复杂,适用于对数据一致性要求极高的场景。
- 编写自定义脚本:对于特定的数据迁移需求,可以编写PL/SQL脚本或使用外部工具(如Python、Shell脚本)来实现数据的提取、转换和加载(ETL)。
