小刚给小明一个dmp备份文件,但是不知道里面有什么,想新建一个库来恢复查看一些数据,也不能影响别人正常使用,
SQL> CREATE USER test_schema IDENTIFIED BY test;
第 1 行出现错误:
ORA-65096: 公用用户名或角色名无效
ORA-65096 表示你尝试在 CDB(容器数据库)中创建一个不符合命名规则的用户。默认情况下,CDB 中的用户应在 PDB(可插入数据库)中创建
在 Oracle 数据库中,CDB(容器数据库)和 PDB(可插入数据库)的用户命名规则有所不同:
CDB(容器数据库)命名规则
1. 公用用户(Common Users):以 `C##` 或 `c##` 开头。公用用户存在于所有 PDB 中。例如,`C##ADMIN`。
2. 本地用户(Local Users):只能存在于当前 PDB 中,不能以 `C##` 开头。
在 CDB 中创建公用用户
CREATE USER C##test IDENTIFIED BY password;
PDB(可插入数据库)命名规则
1. 本地用户(Local Users):在 PDB 中创建的用户,不需要特别的前缀。例如,`test_schema`。
在 PDB 中创建本地用户:
ALTER SESSION SET CONTAINER=my_pdb;
CREATE USER test_schema IDENTIFIED BY password;
ORACLE 12C之前,
一个实例只能与一个数据库相关联,数据库可以被多个实例所加载,
12C引入多租用户环境,
允许一个数据库容器(CDB-Container Database)
承载多个可插拔数据库(PDB-Pluggable Database)
实例与数据库可以是一对多的关系
那我想在一个新的PDB里新建用户怎么操作呢
-- 1 登录到 CDB 根容器
[root@localhost ~]# sqlplus sys/**** as sysdba
连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> SHOW CON_NAME;
CON_NAME
------------------------------
CDB$ROOT
– CDB$ROOT 是容器数据库的根容器
– 查询查看当前的容器 PDB 列表:
SQL> SELECT * FROM DBA_PDBS
.
-- 2 创建新的 PDB
CREATE PLUGGABLE DATABASE new_pdb
ADMIN USER pdb_admin IDENTIFIED BY password
FILE_NAME_CONVERT = ('/opt/oracle/oradata/ORCLCDB/', '/path/to/new_pdb/')
ORA-65016: 必须指定 FILE_NAME_CONVERT
(‘/old/path/’, ‘/new/path/’)
/new/path/路径需要有权限
替换new_pdb
、pdb_admin
和password
为你的新 PDB 名称、管理员用户名及其密码。
-- 3 切换到新 PDB
ALTER SESSION SET CONTAINER = new_pdb;
CREATE USER test_schema IDENTIFIED BY test;
.
ORA-01109: 数据库未打开
.
检查数据库的状态:
SELECT NAME, OPEN_MODE FROM V$DATABASE;
.
– 如果数据库已挂起 处于 MOUNT 或 NOMOUNT 状态,执行以下命令:
STARTUP MOUNT;
– 然后,打开数据库:
ALTER DATABASE OPEN;
-- 4 对于容器数据库 (CDB),启动 PDB
ALTER PLUGGABLE DATABASE new_pdb OPEN;
-- 5 创建用户
SQL> CREATE USER test_schema IDENTIFIED BY test;
用户已创建。
-- 6 授权
SQL> GRANT CONNECT, RESOURCE TO test_schema;
授权成功。
SQL> GRANT DBA TO test_schema;
授权成功。
查询数据库中的用户
SELECT * FROM dba_users WHERE username = ‘TEST_SCHEMA’
.
连接到目标 PDB
sqlplus test_schema/test@//10.230.1.12:1521/new_pdb
-- 7 创建备份目录
并且 Oracle 数据库用户有权限访问
mkdir -p /path/to/backup_dir
chown oracle:oracle /path/to/backup_dir
chmod -R 777 /path/to/backup_dir
-- 8 指向路径
Oracle 数据库中创建一个目录对象,指向你刚刚创建的备份目录:
CREATE OR REPLACE DIRECTORY backup_dir AS '/path/to/backup_dir';
-- 9 可选-创建表空间:
如果你需要指定一个特定的表空间来存储这个 schema 的数据,可以创建一个表空间:
CREATE TABLESPACE new_tablespace DATAFILE '/path/to/datafile.dbf' SIZE 100M;
然后,将用户的默认表空间设置为刚创建的表空间:
ALTER USER test_schema DEFAULT TABLESPACE new_tablespace;
修改表空间
ALTER DATABASE DATAFILE '/path/to/new_table_space_file.dbf' RESIZE 500M;
增加表空间
ALTER TABLESPACE NEW_TABLESPACE ADD DATAFILE '/path/to/new_file3.dbf' SIZE 1000M;
dmp导入
impdp
test_schema/test@//10.230.1.12:1521/new_pdb
directory=BACKUP_DIR
dumpfile=2024file.dmp
logfile=import.log
remap_tablespace=XYZ_DATA:NEW_TABLESPACE
remap_schema=XYZ:test_schema
test_schema/test 用户密码
10.230.1.12 数据库服务器的 IP 地址,`1521` 端口号,
new_pdb 是 PDB_NAME
BACKUP_DIR 数据库目录对象,指向文件系统目录 step 8,Data Pump 将在这里查找 .dmp 文件和生成的日志文件
dumpfile=2024file.dmp 指定数据泵导出的 dump 文件,包含要导入的数据
logfile=import.log 指定了导入过程中生成的日志文件名
remap_tablespace=XYZ_DATA:NEW_TABLESPACE 表空间映射:将源表空间 XYZ_DATA 映射到目标表空间 NEW_TABLESPACE
remap_schema=XYZ:test_schema 模式映射:将源模式 XYZ 映射到目标模式 test_schema
KUPW: ORA-39083: 对象类型 TABLE:“XYZ”.“IMP_MOVE_CLIENT_0722” 创建失败, 出现错误:
ORA-00959: 表空间 ‘XYZ_DATA’ 不存在
.
将源模式 XYZ映射到目标模式 test_schema
remap_tablespace=XYZ_DATA:NEW_TABLESPACE
.
或者创建缺失的表空间
CREATE TABLESPACE XYZ_DATA
DATAFILE ‘/path_to_your_datafile/xyz_data01.dbf’
SIZE 100M AUTOEXTEND ON;
处理对象类型 SCHEMA_EXPORT/SEQUENCE/SEQUENCE
ORA-39083: 对象类型 SEQUENCE:“XYZ”.“GX_PROCESS_CLIENT_CLIENTID” 创建失败, 出现错误:
ORA-01917: 用户或角色 ‘’ 不存在
.
导入的数据原本属于不同的 schema,你可以使用 REMAP_SCHEMA 参数将所有对象映射到目标 schema。例,将 XYZ 映射到 test_schema
remap_schema=XYZ:test_schema
.
或者检查用户或角色是否存在
SELECT * FROM DBA_USERS WHERE USERNAME = ‘XYZ’;
SELECT * FROM DBA_ROLES WHERE ROLE = ‘ROLE_NAME’;
如果缺少用户或角色,可以在目标数据库中创建它们
创建用户 XYZ
CREATE USER XYZ IDENTIFIED BY your_password;
GRANT CONNECT, RESOURCE TO XYZ;
创建角色
CREATE ROLE ROLE_NAME;
导入过程中使用的用户具有足够的权限来创建和管理对象。需要授权导入用户
GRANT DBA TO import_user;