Oracle 18c XE在CentOS7中导出xepdb1特定Schema失败求助
解决Oracle 18c XE导出PDB中特定Schema的问题
你遇到的核心问题是expdp默认连接到CDB$ROOT容器,而你的accts_db Schema是在xepdb1这个可插拔数据库(PDB)里,所以直接执行命令会找不到目标Schema。下面是具体的解决方案,分两种常用方式:
方式一:直接在expdp命令中指定连接到PDB
你可以通过在expdp命令里指定PDB的连接字符串,让导出工具直接访问xepdb1:
方法1.1 使用EZCONNECT格式(无需配置tnsnames.ora)
直接替换成如下命令:
expdp system/password123@//localhost:1521/xepdb1 schemas=accts_db directory=accts_bkup_dir dumpfile=accts_db.dmp logfile=accts_db.log
如果你的Oracle监听端口不是默认的1521,记得替换成实际端口号。
方法1.2 使用tnsnames.ora配置的PDB条目
如果你的tnsnames.ora(通常在$ORACLE_HOME/network/admin目录下)已经配置了xepdb1的条目,可以简化命令:
expdp system/password123@xepdb1 schemas=accts_db directory=accts_bkup_dir dumpfile=accts_db.dmp logfile=accts_db.log
方式二:先切换到PDB容器再执行导出
这种方式适合需要先验证Schema或目录权限的场景:
- 用SQL*Plus登录到CDB的sysdba用户:
sqlplus system/password123 as sysdba
- 切换到
xepdb1容器:
ALTER SESSION SET CONTAINER=xepdb1;
- 验证
accts_dbSchema是否存在(Oracle默认用户名是大写,除非创建时用双引号指定小写):
SELECT username FROM dba_users WHERE username = 'ACCTS_DB';
如果返回空结果,说明你可能用了小写用户名,改成WHERE username = 'accts_db'即可(如果创建时加了双引号)。
- 验证
accts_bkup_dir目录是否在PDB中存在并授权:
SELECT directory_name, directory_path FROM dba_directories WHERE directory_name = 'ACCTS_BKUP_DIR';
如果结果为空,需要在PDB中创建目录并授权:
CREATE DIRECTORY accts_bkup_dir AS '/your/actual/backup/path'; GRANT READ, WRITE ON DIRECTORY accts_bkup_dir TO system; GRANT EXP_FULL_DATABASE TO system; -- 授予完整导出权限
- 退出SQL*Plus后,执行带
container参数的expdp命令:
expdp system/password123 schemas=accts_db directory=accts_bkup_dir dumpfile=accts_db.dmp logfile=accts_db.log container=xepdb1
额外注意事项
- 如果你的Schema是用小写字母创建的(创建时加了双引号,比如
CREATE USER "accts_db"...),导出时需要用双引号包裹Schema名:schemas="accts_db" - 确保你的备份目录
/your/actual/backup/path存在,并且Oracle用户(通常是oracle)对该目录有读写权限。
内容的提问来源于stack exchange,提问作者aaludra
相关产品推荐
相关产品推荐

