一、环境:
server1迁移到server2
server1:
服务器号:201
系统:Windows server R2 x64
IP地址:192.168.2.201
oracle数据库版本:oracle 11g R2
端口号:1521
用户名:brdb_1031
密码:nc
迁移到
server2:
服务器号:207
系统:centos7-x64
IP地址:192.168.2.207
oracle数据库版本:oracle 11g R2
oracle安装平台:阿里云docker镜像
端口号:1521
二、准备:
1、在备份前,先检查两个数据库的字符集是否相等
SQL语句:
select userenv('language') from dual;
server1字符集
server2字符集
2、修改server2字符集
AL32UTF8字符集修改为ZHS16GBK
执行如下SQL语句就可修改:
select userenv('language') from dual;shutdown immediate;startup mount;alter system enable restricted session;alter system set job_queue_processes=0;alter system set aq_tm_processes=0;alter database flashback off;alter database open;show parameter recovery;alter system reset db_recovery_file_dest scope=spfile sid='*';alter system reset db_recovery_file_dest_size scope=spfile sid='*';alter database character set internal_use ZHS16GBK;shutdown immediatestartupexit
演示方法二:
连接数据库
$ sqlplus / as sysdba
[oracle@dev /]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Fri May 31 09:34:26 Copyright (c) 1982, , Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL>
查看字符集
SQL> select userenv('language') from dual;
SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.AL32UTF8SQL>
关闭数据库
SQL> shutdown immediate;
SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.
装载启动数据库到mount状态
SQL> startup mount
SQL> startup mountORACLE instance started.Total System Global Area 1603411968 bytesFixed Size 2213776 bytesVariable Size 402655344 bytesDatabase Buffers 1191182336 bytesRedo Buffers7360512 bytesDatabase mounted.
执行如下命令
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;System altered.SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;System altered.SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;System altered.SQL> alter database open;Database altered.SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;ALTER DATABASE CHARACTER SET ZHS16GBK*ERROR at line 1:ORA-12712: new character set must be a superset of old character set # 提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;Database altered.SQL>
我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验
关闭数据库
SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL>
启动数据库
SQL> startupORACLE instance started.Total System Global Area 1603411968 bytesFixed Size 2213776 bytesVariable Size 402655344 bytesDatabase Buffers 1191182336 bytesRedo Buffers7360512 bytesDatabase mounted.Database opened.
查看字符集
报错:
SQL> select userenv(‘language’) from dual;select userenv(‘language’) from dual*ERROR at line 1:ORA-00911: invalid characterSQL>SQL>SQL>SQL> select userenv(‘language’) from dual;select userenv(‘language’) from dual*ERROR at line 1:ORA-00911: invalid characterSQL>
稍等几分钟自动恢复
SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.ZHS16GBKSQL>SQL>
数据库字符集修改完毕
三、数据库的导出(expdp)
server1:
注意:数据库的导出和导入都在Windows命令模式下执行
1、数据库的导出(expdp)
导出某个用户的表空间
语法如下:
expdp 导出用户名/密码@数据库的SID
expdp 登陆用户名/密码@数据库的IP/orcl
schemas=指定导出用户名
dumpfile=文件名.dmp
logfile=日志名.log
directory=备份储存路径名
tables=表名(只导出指定的某张表)
实例:
expdp brdb_1031/nc@orcl dumpfile=brdb_1031_%date:~0,4%-%date:~5,2%-%date:~8,2%.dmp logfile=brdb_1031_%date:~0,4%-%date:~5,2%-%date:~8,2%.log directory=backfile
说明:备份存储路径名可以自己创建也可以查看已有的路径
查看系统中所有的路径
SQL语句:
select * from dba_directories
导出结果如下:
2、只导出指定的某张表
tables=表名
实例:
expdp brdb_0530/nc@orcl tables=SYS_USER dumpfile=SYS_USER_%date:~0,4%-%date:~5,2%-%date:~8,2%.dmp directory=BACKFILE
导出结果如下:
3、只导入某张表
实例:
impdp brdb_0530_ys/123456@orcl dumpfile=SYS_USER_-07-17.dmp directory=BACKFILE table_exists_action=replace remap_tablespace=BRDB1031TABLESPACE:brdb_0530_ys remap_schema=brdb_0530:brdb_0530_ys
四、数据库的导入(impdp)
server2
数据库的导入:
SQL语句:
1、创建物理路径
自行创建一个完整的目录文件夹,用于存放dmp文件
例如:
/oracle-backup-import
创建一个完整的目录文件夹,用于存放表空间
例如:
/oracle-tablespace
2、创建逻辑目录
注意:路径一定要和物理路径是对应关系
语法:
create directory 路径名 as '路径'
实例:
import导入备份文件路径名
create directory import__dir as '/oracle-backup-import'
表空间存放文件路径名
create directory oracle_data as '/oracle-tablespace'
3、创建表空间
语法:
create tablespace 表空间名
datafile ‘物理地址(相当于文件路径)’
size 初始大小(单位M)
autoextend on next 每次自增的大小(单位M)
maxsize unlimited (此关键字用于不限制表空间大小)
实例:
create tablespace brdb_1031
datafile '/oracle-tablespace/brdb_1031_tablespace.dbf'
size 200M
autoextend on next 100M
maxsize UNLIMITED;
注意:
在Linux系统中需要给目录授权,否则报错:permission denied
# chown oracle:oinstall oracle-backup-import
# chown oracle:oinstall oracle-tablespace/
[root@dev /]# chown oracle:oinstall oracle-backup-import[root@dev /]# chown oracle:oinstall oracle-tablespace/[root@dev /]#[root@dev /]# lltotal 24dr-xr-xr-x. 2 root root4096 Dec 3 bindr-xr-xr-x. 4 root root 29 Dec 3 bootdrwxr-xr-x. 5 root root340 May 31 09:14 devdrwxr-xr-x. 1 root root 21 May 31 09:18 etcdrwxr-xr-x. 1 root root 20 Aug 29 homedr-xr-xr-x. 8 root root168 Aug 23 libdr-xr-xr-x. 7 root root8192 Aug 23 lib64drwxr-xr-x. 2 root root 6 Sep 23 mediadrwxr-xr-x. 2 root root 6 Sep 23 mntdrwxr-xr-x. 2 root root 6 Sep 23 optdrwxr-xr-x. 2 oracle oinstall 6 May 31 09:02 oracle-backup-importdrwxr-xr-x. 2 oracle oinstall 6 May 31 09:08 oracle-tablespacedr-xr-xr-x. 249 root root 0 May 31 09:14 procdr-xr-x---. 3 root root124 Aug 26 rootdr-xr-xr-x. 2 root root4096 Aug 23 sbindrwxr-xr-x. 2 root root 6 Sep 23 selinuxdrwxr-xr-x. 2 root root 6 Sep 23 srvdr-xr-xr-x. 13 root root 0 May 26 09:46 sysdrwxrwxrwt. 1 root root 6 May 31 09:14 tmpdrwxr-xr-x. 1 root root 17 Aug 23 usrdrwxr-xr-x. 1 root root 17 Aug 23 var[root@dev /]#
查看已经创建的表空间文件
[root@dev /]# cd oracle-tablespace/[root@dev oracle-tablespace]#[root@dev oracle-tablespace]# lltotal 204808-rw-r-----. 1 oracle oinstall 209723392 May 31 11:32 brdb_1031_tablespace.dbf
4、创建用户并指定表空间
语法:
create user 用户名 identified by 口令[即密码] default tablespace 表空间名;
实例:
create user brdb_1031 identified by 123456 default tablespace brdb_1031
5、目录授权
语法:
grant read,write on directory 路径名 to 用户;
实例:
grant read,write on directory oracle_data to brdb_1031
6、用户授权
一般情况下,我们可以直接赋予角色三种权限connect、resource、dba
语法:
grant 权限1, 权限2, 权限3…… to 用户名
实例:
grant connect, resource, dba to brdb_1031
7、查询数据库用户信息
select * from dba_users
在导出服务器上查询,主要看表空间名(server1)
8、导入dmp文件
server2:
语法:
impdp 用户名/密码@数据库的SID
directory=备份文件存放位置
dumpfile=导出的文件名
logfile=导出的日志名
schemas=指定导入用户名
remap_tablespace=转换表空间(原表空间:新表空间,多个转换用逗号隔开)
remap_schema=转换用户名(原用户名:新用户名)
Oracle11g使用数据泵方式导入出现ORA-39151错误时
导入的数据库中已经有相同的用户名和老旧的表
可以在后边加上参数
table_exists_action=replace(若表存在则替换)
table_exists_action=append/truncate/replace
--append为追加数据
truncate为先删除原表数据再插入数据
replace先drop表,然后创建表,最后插入数据(建议使用replace)
nologfile=y (不写入日志文件)
exclude=user(忽略用户对象已经存在的错误)
tables=表名(只导入指定的某张表)
实例:
$ impdp brdb_1031/123456@helowin directory=IMPORT_DIR dumpfile=BRDB_1031_-05-31.DMP logfile=brdb_1031_-05-31.log remap_tablespace=BRDB1031TABLESPACE:brdb_1031
导入完成,时间较慢,耐心等待
9、相同数据库的备份还原
注意:导入数据前需要先删除序列
实例:
impdp ys_nk/nc@orcl directory=BACKUP dumpfile=YS_NK_-06-14.DMP table_exists_action=replace
table_exists_action=replace(先删除原来的表,然后创建表,最后插入数据)
10、tables=表名(只导入指定的某张表)
实例:
impdp brdb_bjsc_0718/cnbi@orcl directory=dmpdir2 dumpfile=BRDB_BJSC_0718--07-02.DUMP tables=(brdb_bjsc_0718.sys_user,brdb_bjsc_0718.SYS_USERCOMPANY) table_exists_action=replace
说明:全库备份文件只恢复某张表的情况
end