目录
5.Transporting Data with Backup Sets
6.Transporting Inconsistent Tablespaces
1.从non-cdb导出数据到pdb
Exporting from a Non-CDB and Importing into a PDB
从non-cdb导出数据
1.声明字符集
SQL> select property_name ,property_value from database_properties;-----查詢非 cdb 數據庫的字符集和語言
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------------------------------------
DICT.BASE 2
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
DEFAULT_EDITION ORA$BASE
Flashback Timestamp TimeZone GMT
TDE_MASTER_KEY_ID
DST_UPGRADE_STATE NONE
DST_PRIMARY_TT_VERSION 11
DST_SECONDARY_TT_VERSION 0
DEFAULT_TBS_TYPE SMALLFILE
NLS_LANGUAGE AMERICAN------语言
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------------------------------------
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8------字符集
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN------语言
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------------------------------------
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 11.2.0.1.0
GLOBAL_DB_NAME CAI
EXPORT_VIEWS_VERSION 8
WORKLOAD_CAPTURE_MODE
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------------------------------------
WORKLOAD_REPLAY_MODE
NO_USERID_VERIFIER_SALT 8BF56230FC49D6ECFE53EB96A5922DD5
DBTIMEZONE 00:00
36 rows selected.
SQL> create directory dump_dir as '/home/oracle/scripts';------创建一个目录
Directory created.
SQL> grant read,write,execute on directory dump_dir to system;------给system用户赋予目录的权限
Grant succeeded.
2.执行命令导出
[oracle@11g ~]$ cd /home/oracle/scripts ------创建一个目录
-bash: cd: /home/oracle/scripts: No such file or directory
[oracle@11g ~]$ mkdir /home/oracle/scripts
[oracle@11g ~]$ ll -ls
total 0
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Desktop
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Documents
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Downloads
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Music
0 drwxr-x--- 3 oracle oinstall 18 Jan 8 13:10 oradiag_oracle
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Pictures
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Public
0 drwxr-xr-x 2 oracle oinstall 6 Jan 9 13:21 scripts
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Templates
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 11:36 Videos
[oracle@11g ~]$ pwd
/home/oracle
[oracle@11g ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8-------声明一下字符集和语言,这样导出的时候才不会需要转换
[oracle@11g ~]$ expdp system/oracle full=y dumpfile=cai.dmp directory=dump_dir-----导出整个数据库的所有对象
Export: Release 11.2.0.1.0 - Production on Tue Jan 9 13:22:29 2024
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
[oracle@11g ~]$ cd scripts
[oracle@11g scripts]$ ll -ls-----查看导出后的dump文件
total 166184
166068 -rw-r----- 1 oracle oinstall 170053632 Jan 9 13:27 cai.dmp
116 -rw-r--r-- 1 oracle oinstall 115893 Jan 9 13:27 export.log
[oracle@11g scripts]$ scp cai.dmp 19c:/home/oracle/scripts-------把dmp文件传到容器数据库所在的主机上,这里需要编辑/etc/hosts文件
oracle@19c's password:
cai.dmp 100% 162MB 23.6MB/s 00:06
[oracle@19c ~]$ mkdir /home/oracle/scripts-----同样在19c下也创建一个目录
[oracle@19c ~]$ ll -ls
total 12
4 -rw-r--r-- 1 oracle oinstall 276 Jan 4 15:20 C##U1.log
0 drwxr-xr-x 2 oracle oinstall 6 Nov 27 10:47 Desktop
0 drwxr-xr-x 2 oracle oinstall 6 Nov 27 10:47 Documents
0 drwxr-xr-x 2 oracle oinstall 6 Nov 27 10:47 Downloads
0 drwxr-xr-x 2 oracle oinstall 6 Nov 27 10:47 Music
0 drwxr-xr-x 2 oracle oinstall 6 Nov 27 10:47 Pictures
0 drwxr-xr-x 2 oracle oinstall 6 Nov 27 10:47 Public
0 drwxr-xr-x 2 oracle oinstall 6 Jan 8 13:52 scripts
[oracle@19c ~]$ cd scripts-----在19c查看文件是否传输成功,以下显示传输成功了
[oracle@19c scripts]$ ll -ls
total 166068
166068 -rw-r----- 1 oracle oinstall 170053632 Jan 8 14:23 cai.dmp
注意:
全库数据传输我们最好不要用数据泵进行传输,因为会遇到各种各样的问题,如果只是导出表空间,导出一张表,是可以的。
1.共享池太小会导致导入失败,可以通过告警日志获得信息。
2、 如果在 profile 中设置了资源限制,也会导致导入失败,比如 SESSIONS_PER_USER 设置的太小。
3、 如果源数据库初始时用的是 OMF 管理,那么目标数据库也应该是 OMF 管理, 如果不是,则要创建和源表空间路径一样的路径。如果是要启用OMF管理,要设置DB_CREATE_FILE_DEST参数,OMF默认数据文件大小是100m,AUTOEXTEND 为UNLIMITED。
4、 在导入过程中,会尝试创建跟源数据库表空间名字一样的 undo、temp、users 等表空间,如果已经存在,则忽略。
5、 如果源数据库有创建非标准块的表空间,则要提前分配非标准块的数据缓冲区, 否则在建立表空间时会报错。
6、 如果是全庫導出導入(會導出所有的對象)目标数据库最好是新建的空的数据库。
在pdb數據庫導入
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
SQL> alter session set container=pdb2;
Session altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
4 PDB2 MOUNTED
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/CDB/pdb2/system01.dbf
/u01/app/oracle/oradata/CDB/pdb2/sysaux01.dbf
/u01/app/oracle/oradata/CDB/pdb2/undotbs01.dbf
SQL> select property_name ,property_value from database_properties;
select property_name ,property_value from database_properties
*
ERROR at line 1:
ORA-01219: database or pluggable database not open: queries allowed on fixed
tables or views only
SQL>
SQL>
SQL>
SQL>
SQL> create directory dump_dir as '/home/oracle/scripts';
create directory dump_dir as '/home/oracle/scripts'
*
ERROR at line 1:
ORA-01109: database not open
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
4 PDB2 MOUNTED
SQL> startup
Warning: PDB altered with errors.
Pluggable Database opened.
SQL> create directory dump_dir as '/home/oracle/scripts';
Directory created.
SQL> grant read,write,execute on directory dump_dir to system;
Grant succeeded.
ripts/orcl.dump pg-xc3:/home/oracle/scripts-------在non-cdb數據庫中執行命令移動轉儲文件,pg-xc3是pdb數據庫的hostname
$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8-----同樣需要在pdb數據声明语言和字符集
impdp system/oracle@sales FULL=Y DUMPFILE=orcl.dmp directory=dump_dir
2.数据文件+数据泵进行数据库的传输
Full Transportable Export/Import
只传输除了system,sysaux,temp,undo以外的用户表空间,這種方式傳輸的是用戶自定義的表空間,這種方式適用於资料量大的数据库,比第一种方式快。
从non-cdb 导出表空间
1.导出前,将数据库中所有用户定义的表空间设置为只读。
2.以DATAPUMP_EXP_FULL_数据库角色的用户身份调用 Oracle Data Pump导出实用程序, 并指定完整可传输导出选项:FULL=Y 和 transportable=ALWAYS。LOGFILE 参数很重要, 因为它将包含导入操作需要传输的数据文件列表。
3.在导出log的最后会提示需要传输两个数据文件
3.dump文件也需要拷贝过去
在pdb數據庫導入
导入前,传输转储文件,目标数据库如果有跟迁移表空间名字和数据文件相同的需要 修改导入数据库数据文件的字,如果目标数据库的表空间你不需要,那你可以直接把这个表空间删除
SQL> alter tablespace users rename to user2;
SQL> alter database move datafile '/u01/app/oracle/oradata/CDB2/sales/users01.dbf' to '/u01/app/oracle/oradata/CDB2/sales/users02.dbf';
4.传输可能已转换的数据文件。如果要将数据库传输到与源平台不同的平台,请确定源 平台和目标平台是否都支持跨平台数据库传输。如果两个平台的端点相同,则无需进行 转换。否则,必须使用 DBMS_FILE_TRANSFER 或 RMAN CONVERT 命令在源数据库或目标 数据库中对数据库中的每个表空间进行转换。
执行命令导入数据
$ impdp system/oracle@newpdb1 \
full=y \-----代表導入所有可導入的對象
dumpfile=orcl.dmp \
directory=dump_dir \
transport_datafiles='' \------這裏指的是你遷移過來的數據文件是什麽
logfile=imp.log
3.数据库+dblink传输数据
以上数据文件+数据泵的方式,我们是先将元数据导出,然后再拷贝到目标数据库,通过创建dblink的方式实现导出导入,不会产生dump文件
从non-cdb导出数据
SQL> create public database link newpdb1_lk connect to system identified by oracle using 'newpdb1';----- 在目标数据库创建 dblink 到源数据库,先在 tnsnames 文件添加连接别名
Oracle Data Pump 网络导入复制用户定义表空间中包含的对象的元数据,以及管理表空间 中包含的用户定义对象(如 SYSTEM 和 SYSAUX)的元数据和数据。导入完成后,用户定义的表空间处于读写模式。
复制源数据库数据文件到目标数据库相应位置
在pdb數據庫導入
impdp system/oracle@newpdb1 \
full=y \
network_link=newpdb1_lk \
transportable=always \
transport_datafiles='' \
logfile=imp.log
4.使用rman跨平台传输数据
Using RMAN to Transport Data Across Platforms
1.首先检查目标数据库和源数据库的操作系统平台,只要是出现在这里面的平台都是可以传输的,如果平台不同就需要进行转换
select PLATFORM_NAME from v$tranceportable_platforms;
第一步:转换文件
这个目标库的数据文件和元数据是事先从源库导出然后放入目标库的
RMAN>
CONVERT DATAFILE '/home/oracle/scripts/transport_tbs01.dbf'-----需要转换的数据文件,也就是源库的数据文件
TO PLATFORM="Linux x86 64-bit"----目标数据库的系统,也就是当前系统
FROM PLATFORM="Solaris[tm] OE (32-bit)"-----源平台系统
DB_FILE_NAME_CONVERT='/home/oracle/scripts/transport_tbs01.dbf','/u01/app/oracle/
oradata/ORCL/transport_tbs01.dbf';----源平台系统的数据文件,后者为转换后数据文件的位置
第二步,导入元数据前要先创建用户,可以先导入,通过报错提示创建需要的:
5.Transporting Data with Backup Sets
1、将表空间设置为只读
SQL> alter tablespace trans_tbs read only;-------将需要迁移的表空间设置为只读
2、 使用 rman 进行备份
RMAN> BACKUP FOR TRANSPORT FORMAT '/home/oracle/scripts/trans_tbs.bck'-----产生备份片
DATAPUMP FORMAT '/home/oracle/scripts/trans_tbs.dmp' TABLESPACE trans_tbs;---备份表空间的元数据
3.copy备份片和元数据到目标数据库
scp trans_tbs.bck pg-xc3:/home/oracle/scripts
scp rans_tbs.dmp pg-xc3:/home/oracle/scripts
4.在目标数据库进行导入
RMAN> RESTORE FOREIGN TABLESPACE trans_tbs
FORMAT '/u01/app/oracle/oradata/CDB2/sales/trans_tbs.dbf'
FROM BACKUPSET '/home/oracle/scripts/trans_tbs.bck'
DUMP FILE FROM BACKUPSET '/home/oracle/scripts/trans_tbs.dmp'
6.Transporting Inconsistent Tablespaces
使用增量备份的方式对 pdb 进行迁移,可以减少 pdb 的停机时间。
1、 记录下创建 0 级备份数据库之前的 SCN。
SQL> select CHECKPOINT_CHANGE# from v$datafile;-----这个是登录到pdb数据库下查看
CHECKPOINT_CHANGE#
------------------
3318694
2、 创建 0 级备份,此时 PDB 是可以处于 open 状态(rman 登录到 cdb 下操作):
$ rman target /----------直接登录到cdb下进行备份操作
RMAN> BACKUP INCREMENTAL LEVEL 0
FOR TRANSPORT
ALLOW INCONSISTENT
PLUGGABLE DATABASE CUUGPDB1
FORMAT '/home/oracle/rman_bk/CUUGPDB1_level0.bck';
3、 此时需要关闭 pdb,对 pdb 进行增量备份并且生成 xml 元数据,注意要使用 from scn,否则将来在目标数据库 recovery 的时候无法进行增量恢复(rman 登录到 cdb 下操作):
RMAN> BACKUP INCREMENTAL from scn 2476916
FOR TRANSPORT UNPLUG INTO '/home/oracle/rman_bk/metadata_CUUGPDB1.xml'-----这个其实就是把数据库拔出来将里面的数据生成元数据
PLUGGABLE DATABASE CUUGPDB1
FORMAT '/home/oracle/rman_bk/CUUGPDB1_level1_con.bck';
4、 把新产生的备份片和源数据 cp 到目标主机。 0 级备份片也复制到目标主机
6、 使用 0 级备份进行恢复,会在备份片所在的目录下产生数据文件,数据文件的名 字自动产生:
RMAN> RESTORE
FOREIGN PLUGGABLE DATABASE CUUGPDB1
FORMAT '/home/oracle/rman_bk/%U'
FROM BACKUPSET '/home/oracle/rman_bk/CUUGPDB1_level0.bck';
restore命令执行后会看到目录下生成有几个数据文件
7、 使用增量备份进行 recovery,同时把 pdb 插入的 cdb 中,注意 pdb 的数据文件比 较多,不要弄错:
8、 此时在 cdb 中会生成一个以 CDB 数据库名字为开头的,后面是随机生成的数字:
10、修改 pdb 的名字:
10.1、关闭 pdb
alter pluggable database ORCL_51788 close;
10.2、限制会话方式打开 pdb
alter pluggable database ORCL_51788 open restricted;
10.3、修改 pdb 名字(连接到 pdb 下执行下面命令)
alter pluggable database ORCL_51788 rename global_name to CUUGPDB1;
10.4、重新打开 pdb 即可