最近猛学oracle,头皮经常发痒,我都能感觉到我的头发自己断掉,可能附近的脑细胞迭代太快,很快成了死皮,头发也跟着折了,我开始担忧我的发量。
重要的事情说三遍:sqlplus登录不上去的时候,要看一下,是否su到oracle了,root用户是管理系统的,oracle角色才是做数据库操作的,建文件夹的时候注意是需要在哪个角色下创建,这很重要,否则有时会报错,因为权限不对
重要的事情说三遍:sqlplus登录不上去的时候,要看一下,是否su到oracle了,root用户是管理系统的,oracle角色才是做数据库操作的,建文件夹的时候注意是需要在哪个角色下创建,这很重要,否则有时会报错,因为权限不对
重要的事情说三遍:sqlplus登录不上去的时候,要看一下,是否su到oracle了,root用户是管理系统的,oracle角色才是做数据库操作的,建文件夹的时候注意是需要在哪个角色下创建,这很重要,否则有时会报错,因为权限不对
如果报这个错误,基本上就是没切到oracle角色
ERROR: ORA-01017: invalid username/password; logon denied
还有一种可能就是,系统禁止了远程用户登录,去百度搜一下相关操作(remote_login_passwordfile=EXCLUSIVE)检查一下是否配置正确
如果sqlplus / as sysdba都登不上去了,查看sqlnet.ora里,是否被坑,添加了SQLNET.AUTHENTICATION_SERVICES= (NTS),这个是windows的,不是linux的。。。。
Oracle中的12C新特性-容器数据库
—12.1.0.2_GI_RAC_Create_CDB_Blog
三月份的时候杰哥跟我讲有时间部署 12C-容器数据库,参考公司的迁移文档,做个测试。这个事一直拖,最近有空尝试了一下,还是挺不错的,就是非常的烧内存。
一、12C概述
Oracle 12C 引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
其实大家如果对SQL SERVER比较熟悉的话,这种CDB与PDB是不是感觉和SQL SERVER的单实例多数据库架构是一回事呢。像PDB$SEED可以看成是master、msdb等系统数据库,PDBS可以看成用户创建的数据库。而可插拔的概念与SQL SERVER中的用户数据库的分离、附加其实就是那么一回事。
二、CDB组件(Components of a CDB)
一个CDB数据库容器包含了下面一些组件:
-ROOT组件
ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。
-SEED组件
Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。
-PDBS
CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。
注意:
①:一个CDB可以包含253个PDB(去掉一个是seed还能创建252个PDB)。
②:Root,seed以及每一个PDB的数据文件是独立的。
③:一个单实例的CDB有一个redo log;RAC环境中每个实例有一个redo log。
④:只有一组后台进程,它们被ROOT和所有PDB共享。
⑤:Root的全局数据库名就是CDB的全局数据库名;PDB的全局数据库名是由PDB name和DB_DOMAIN参数共同定义的。
⑥:一个CDB使用一个SPFILE或者一个PFILE,其中为ROOT设置的参数的值可以被PDB继承。另外,也可以使用ALTER SYSTEM语句来设置PDB的参数。对参数文件执行 操作时,必须使用common user并且使用AS SYSDBA, ASSYSOPER, AS SYSBACKUP来连接数据库。要创建CDB,必须要将初始化参数ENABLE_PLUGGABLE_DATABASE的 值设置为TRUE。
⑦:所有PDB的字符集都使用CDB的字符集。
可以设置所有PDB的时区与CDB相同,也可以单独为PDB设置时区。
块大小被应用于整个CDB。
一个CDB也仅有一个控制文件(可以多路复用)。
⑧:Root与每一个PDB都有自己的SYSAUX表空间和SYSTEM表空间。可以为root和每一个PDB设置默认表空间。而默认的临时表空间对于整个CDB只有一个,但是可以为 每个PDB创建临时表空间。
⑨:撤销表空间对于CDB是唯一的。在CDB中,初始化参数UNDO_MANAGEMENT必须被设置为AUTO。当前容器为PDB时,无法通过数据字典视图查看撤销表空间,只能通 过动态性能视图。
三、 PDB简介
1.PDB新特点的优势
》可以把多个PDB集成进一个平台。
》可以快速提供一个新的PDB或一个已有PDB的克隆。
》通过拔插技术,可以快速把存在的数据库重新部署到一个新平台上。
》多个PDB数据库补丁或升级一次完成。
》通过把单个PDB拔插到较高版本的不同CDB,可以补丁或升级一个PDB。
》从同一个CDB中众多PDB中分离出某个PDB的内容。
》分离这些PDB应用管理员的责任。
2.PDB新特点的功能
》在一个CDB中,你可以拥有很多PDB。
》PDB和12.1之前版本的普通数据库是向后兼容的。
》PDB对应用是透明的——你不需要改变客户端代码或数据库对象。
》RAC中每个实例作为一个整体打开CDB(因此CDB和其中的PDB数据库版本都是相同的)。
》会话仅仅看到它自己连接的那个PDB。
》你可以从一个CDB拔出一个PDB,然后插入另一个CDB。
》你可以在同一个CDB或不同CDB间克隆PDB。
》资源管理器随着PDB的功能得以扩展。
》通过SQL语句实现了实体PDB的操作(创建,拔出,插入,克隆,清除,设置打开模式)。
》当连接到所谓的“根”(root)时,CDB管理员来执行这些操作。
》所有的PDB能被一次备份,但可以分别单独恢复。
3.PDB的详解
》每个PDB有自己的私有数据字典用于用户创建的数据库对象;另一方面,CDB作为一个整体也包含Oracle提供系统的数据字典,其中,每个数据字典定义自己的命名空间。换句话说,有全局数据字典(CDB级)和本地数据字典(PDB级)。
》有新的分开的数据字典架构,该架构允许一个PDB被快速从一个CDB拔出并插入一个不同的CDB。
》每个PDB只能看到oracle提供系统的只读定义。
》有全局数据库参数,也有本地数据库参数。PDB参数仅仅属于特定的PDB,并且拔出后,PDB参数也将保持不变。
》数据库用户可以是全局的(CDB)或本地的(PDB)。SYS和SYSTEM用户一开始就在两级DB中存在。如果你在CDB中创建了一个新用户,那么你在PDB中也能看到这个用户。在PDB中创建的用户只能在该PDB中使用。
》临时表空间可以是全局或本地的。
》Redo日志和Undo表空间都是全局的(CDB级)。
》Data Guard在CDB级作为一个整体发挥作用;RMAN调度的备份也作为一个整体在CDB级完成;任何时候,你可以只备份一个PDB。
》应用连接PDB时,不需做代码修改;系统管理员可以连接CDB;连接串中的服务名确定目标PDB。
》PDB允许更加清晰的声明定义一个应用;一个PDB对同一个CDB里的其他PDB一无所知;每个PDB是个密闭的容器。这保证了新层面DB的独立和安全。
四、 日常操作
1. 查看数据库是否为CDB
[root@vastdata11 ~]# su - oracle``[oracle@vastdata11 ~]$ sqlplus / ``as` `sysdba``SQL*Plus: Release 12.1.0.2.0 Production ``on` `Sat Jun 1 21:42:21 2019``Copyright (c) 1982, 2014, Oracle. ``All` `rights reserved.``Connected ``to``:``Oracle ``Database` `12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production``With` `the Partitioning, ``Real` `Application Clusters, Automatic Storage Management, OLAP,``Advanced Analytics ``and` `Real` `Application Testing options``SQL> ``select` `name``,cdb,open_mode,con_id ``from` `v$``database``;``NAME` `CDB OPEN_MODE CON_ID``------------------ ------ ---------------------------------------- ----------``CDB YES ``READ` `WRITE 0
2. 查看当前的容器
SQL> show con_name;``CON_NAME``------------------------------``CDB$ROOT``SQL> ``select` `Sys_Context(``'Userenv'``, ``'Con_Name'``) ``"current Container"` `from` `dual;``current` `Container``--------------------------------------------------------------------------------``CDB$ROOT
3 .查看CDB中的PDB信息
SQL> ``select` `con_id, dbid, guid, ``name` `, open_mode ``from` `v$pdbs;`` ``CON_ID DBID GUID ``NAME` `OPEN_MODE``---------- ---------- -------------------------------- ------------------------------------------------------------ --------------------`` ``2 2382420430 8A33449DBB2C529AE0530B38A8C0899C PDB$SEED ``READ` `ONLY`` ``3 1983375270 8A337E167FD16986E0530B38A8C0632A PDB1 ``READ` `WRITE`` ``4 2621964339 8A33890C63336EADE0530B38A8C02ED2 PDB2 ``READ` `WRITE`` ``5 4092698095 8A3390728AB570E0E0530B38A8C0006E PDB3 ``READ` `WRITE`` ` `SQL> show pdbs `` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``2 PDB$SEED ``READ` `ONLY` `NO`` ``3 PDB1 MOUNTED`` ``4 PDB2 MOUNTED`` ``5 PDB3 MOUNTED
4. 启动和关闭已创建好的PDB数据库
SQL> ``alter` `pluggable ``database` `pdb1 ``open``;``Pluggable ``database` `altered.``SQL> show pdbs `` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``2 PDB$SEED ``READ` `ONLY` `NO`` ``3 PDB1 ``READ` `WRITE ``NO`` ``4 PDB2 MOUNTED`` ``5 PDB3 MOUNTED``SQL> ``alter` `pluggable ``database` `pdb1 ``close``; ``Pluggable ``database` `altered. ``SQL> show pdbs `` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``2 PDB$SEED ``READ` `ONLY` `NO`` ``3 PDB1 MOUNTED`` ``4 PDB2 MOUNTED`` ``5 PDB3 MOUNTED`` ` `----------也可以通过sqlplus使用传统的startup和shutdown命令来启动和关闭PDB-----------``SQL> ``alter` `session ``set` `container=pdb1;``Session altered.``SQL> startup``Pluggable ``Database` `opened.``SQL> show pdbs`` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``3 PDB1 ``READ` `WRITE ``NO``SQL> shu immediate;``Pluggable ``Database` `closed.``SQL> show pdbs`` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``3 PDB1 MOUNTED``SQL> ``alter` `session ``set` `container=CDB$ROOT;``Session altered.``SQL> show pdbs`` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``2 PDB$SEED ``READ` `ONLY` `NO`` ``3 PDB1 MOUNTED`` ``4 PDB2 MOUNTED`` ``5 PDB3 MOUNTED
5.配置建通文件,并通过网络登陆PDB1数据库
监听文件目录在 $ORACLE_HOME/network/admin
[oracle@vastdata11 admin]$ cat tnsnames.ora ``# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora``# Generated ``by` `Oracle configuration tools.``CDB =`` ``(DESCRIPTION =`` ``(ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521))`` ``(CONNECT_DATA =`` ``(SERVER = DEDICATED)`` ``(SERVICE_NAME = cdb)`` ``)`` ``)`` ` `PDB1 =`` ``(DESCRIPTION =`` ``(ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521))`` ``(CONNECT_DATA =`` ``(SERVER = DEDICATED)`` ``(SERVICE_NAME = pdb1)`` ``)`` ``)``[oracle@vastdata11 admin]$ tnsping pdb1``TNS Ping Utility ``for` `Linux: Version 12.1.0.2.0 - Production ``on` `01-JUN-2019 23:16:33``Copyright (c) 1997, 2014, Oracle. ``All` `rights reserved.``Used parameter files:``Used TNSNAMES adapter ``to` `resolve the alias``Attempting ``to` `contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1)))``OK (0 msec)`` ` `[oracle@vastdata11 admin]$ sqlplus system/oracle@pdb1``SQL*Plus: Release 12.1.0.2.0 Production ``on` `Sat Jun 1 23:14:15 2019``Copyright (c) 1982, 2014, Oracle. ``All` `rights reserved.``Connected ``to``:``Oracle ``Database` `12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production``With` `the Partitioning, ``Real` `Application Clusters, Automatic Storage Management, OLAP,``Advanced Analytics ``and` `Real` `Application Testing options``SQL> ``select` `name``,cdb,open_mode,con_id ``from` `v$``database``;``NAME` `CDB OPEN_MODE CON_ID``------------------ ------ ---------------------------------------- ----------``CDB YES ``READ` `WRITE 0`` ` `SQL> show con_name``CON_NAME``------------------------------``PDB1`` ` `SQL> ``select` `name` `from` `v$datafile;``NAME``--------------------------------------------------------------------------------``+DATA/CDB/DATAFILE/undotbs1.280.1009718515``+DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/system.292.1009719563``+DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/sysaux.293.1009719563``+DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/users.295.1009719733``SQL>
6.创建CDB启动触发器
oracle12C中在启动数据库的时候, PDB 并不会随着 CDB 而启动。
不过我们可以通过创建一个触发器让 PDB 能够随 CDB 启动。如下:
SQL> SHOW CON_NAME `` ``CON_NAME `` ``------------------------------ `` ``CDB$ROOT `` ``SQL> ``CREATE` `OR` `REPLACE` `TRIGGER` `open_pdbs `` ``2 ``AFTER` `STARTUP ``ON` `DATABASE` ` ``3 ``BEGIN` ` ``4 ``EXECUTE` `IMMEDIATE ``'ALTER PLUGGABLE DATABASE ALL OPEN'``; `` ``5 ``END` `open_pdbs; `` ``6 /``Trigger` `created.``SQL> shu immediate;``Database` `closed.``Database` `dismounted.``ORACLE instance shut down.``SQL>startup``ORACLE instance started.``Total System ``Global` `Area 1560281088 bytes``Fixed ``Size` `2924784 bytes``Variable ``Size` `570429200 bytes``Database` `Buffers 973078528 bytes``Redo Buffers 13848576 bytes``Database` `mounted.``Database` `opened.``SQL>show pdbs `` ``CON_ID CON_NAME ``OPEN` `MODE RESTRICTED``---------- ------------------------------ ---------- ----------`` ``2 PDB$SEED ``READ` `ONLY` `NO`` ``3 PDB1 ``READ` `WRITE ``NO`` ``4 PDB2 ``READ` `WRITE ``NO`` ``5 PDB3 ``READ` `WRITE ``NO
7.创建一个新的PDB
SQL> ``create` `pluggable ``database` `pdb4 admin ``user` `admin identified ``by` `admin;``SQL> ``alter` `pluggable ``database` `pdb4 ``open``;``SQL> ``select` `con_id,dbid,con_uid,guid,``name``,open_mode,create_scn,total_size,block_size ``from` `v$pdbs;`` ``CON_ID DBID CON_UID GUID ``NAME` `OPEN_MODE CREATE_SCN TOTAL_SIZE BLOCK_SIZE``---------- ----- ---------- -------------------------------- ----------- ---------- ---------- ---------- ----------`` ``2 427872663 427872663 439BFCB2A2EE1BE7E055000000000001 PDB$SEED ``READ` `ONLY` `1594401 838860800 8192`` ``3 1891424478 1891424478 439C5B1174C121B7E055000000000001 FEIGE ``READ` `WRITE 1753608 865075200 8192`` ``4 2998508999 2998508999 53F376E8715628BCE055000000000001 PDB4 ``READ` `WRITE 1757024 859832320 8192
“admin user”子句是必须的,在扩展格式,给新用户赋予了权限和角色,该用户仅在admin内可以创建新会话。 在创建完可插拔数据库后,新的PDB处于MOUNTED模式.
8.克隆一个新的PDB
SQL> ``create` `pluggable ``database` `pdb5 ``from` `pdb4;``SQL> ``alter` `pluggable ``database` `pdb5 ``open``;``切换到PDB,或切换到CDB``SQL> ``alter` `session ``set` `container=pdb4;``SQL> ``alter` `session ``set` `container=cdb$root;``关闭一个pdb和关闭所有的pdb``SQL> ``alter` `pluggable ``database` `pdb4 ``close``;``SQL> ``alter` `pluggable ``database` `all` `close``;
9.插入一个pdb数据库
pdb5.xml:文件确定数据文件的名字和全路径等信息。这些信息在插入操作时会用到。 注意:PDB还是其从中拔出的CDB的一部分,只是现在状态变为了拔出(UNPLUGGED)而已。
SQL> ``alter` `pluggable ``database` `pdb5 ``close``;``SQL> ``alter` `pluggable ``database` `pdb5 unplug ``into` `'/opt/oracle/oradata/pdb5.xml'``;
—-在当前的容器中删除这个pdb
SQL> ``drop` `pluggable ``database` `pdb5 keep datafiles;
—-查看pdb和这个容器是否兼容,如果报错说明不兼容
exec` `DBMS_PDB.Check_Plug_Compatibility(PDB_Descr_File=>``'/opt/oracle/oradata/pdb5.xml'``);
—-开始插入pdb
(using关键字后必须跟上PDB描述的绝对路径,即,先前拔出操作时产生的.XML文件)
create` `pluggable ``database` `pdb5 using ``'/opt/oracle/oradata/pdb5.xml'` `move` `file_name_convert = (``'/cdb1/'``, ``'/cdb2/'``);
—-最后打开这个pdb
alter` `pluggable ``database` `pdb5 ``open``;
—至此,
cdb与pdb的一些基础的知识和操作都有介绍,
就先总结到这里。