阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 12c中多宿主容器数据库(CDBs)和可插拔数据库(PDBs)新特性之运行脚本

199次阅读
没有评论

共计 6904 个字符,预计需要花费 18 分钟才能阅读完成。

对开发者和 DBA 们来说,对 shell 脚本批量任务的影响成了多宿主选项带来的最大改变之一。因为多宿主环境通过服务来连接到可插拔数据库,因此,依靠 CRON 和 OS 认证成了换成多宿主环境后的一个最大问题。本文提供了一些办法来解决之前 shell 脚本工作在多宿主环境的问题。

1.        设置容器

对于那些工作在容器级的 DBA 脚本来说,用 ”/ AS SYSDBA” 就可以像之前一样工作。当你在可插拔数据库内运行脚本时,就会出现问题。解决这个问题的最简单办法就是继续用 ”/ asSYSDBA” 连接,但在脚本中用 ALTER SESSION SET CONTAINER 命令设置容器。

sqlplus / as sysdba <<EOF

ALTER SESSION SET CONTAINER = pdb1;

— 和之前一样运行任务

SHOW CON_NAME;

EXIT;

EOF

为了让脚本更通用,把 PDB 名当做参数。将下面的脚本存为 ”set_container_test.sh”.

sqlplus / as sysdba <<EOF

ALTER SESSION SET CONTAINER = $1;

– 像之前一样运行任务

SHOW CON_NAME;

EXIT;

EOF

把 PDB 名作为第一个参数运行脚本显示,设置的容器是对的。

$ chmod u+x set_container_test.sh

$ ./set_container_test.sh pdb1

SQL*Plus: Release 12.1.0.1.0 Production onFri Apr 18 16:48:51 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:

Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 – 64bit Production

With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL> SQL>

Session altered.

SQL> SQL> SQL>

CON_NAME

——————————

PDB1

SQL> SQL> Disconnected from OracleDatabase 12c Enterprise Edition Release 12.1.0.1.0 – 64bit Production

With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

$

2.        TWO_TASK 方法

用 TWO_TASK 环境变量是连接到特定用户的一个浅显的方法,可惜的是,用 ”/ ASSYSDBA” 连接方法行不通。

$ export TWO_TASK=pdb1

$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production onFri Apr 18 16:54:34 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

ERROR:

ORA-01017: invalid username/password; logondenied

Enter user-name:

用确定的用户名和口令结合 TWO_TASK 方法,能像之前一样正常工作。

$ export TWO_TASK=pdb1

$ sqlplus test/test

SQL*Plus: Release 12.1.0.1.0 Production onFri Apr 18 16:57:46 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Wed Apr 02 201410:05:22 +01:00

Connected to:

Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 – 64bit Production

With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL> SHOW CON_NAME;

CON_NAME

——————————

PDB1

SQL>

也许你并不希望在脚本中包含确定的用户名和密码,但如果增加一个指向连接的服务或使用 TWO_TASK 环境变量,就可以连接到确定的 PDB。

3.        安全的外部口令存储

Oracle 10g 引进了不用显式提供认证,而是使用安全外部口令存储来连接数据库的能力。这种基于服务的方式事实上也会很好的使用 PDB 环境。

把下面的项放入 ”$ORACLE_HOME/network/admin/sqlnet.ora” 文件,并确定要求的钱包目录。

WALLET_LOCATION =

  (SOURCE =

    (METHOD = FILE)

    (METHOD_DATA =

      (DIRECTORY = /u01/app/oracle/wallet)

    )

  )

SQLNET.WALLET_OVERRIDE = TRUE

SSL_CLIENT_AUTHENTICATION = FALSE

SSL_VERSION = 0

创建一个钱包来存储认证信息。Oracle11gR2 之后,通过 orapki 很好的实现了该功能,如果将钱包拷到其他机器,将会阻止自动登录。

$ mkdir -p /u01/app/oracle/wallet

$ orapki wallet create -wallet”/u01/app/oracle/wallet” -pwd “mypassword”-auto_login_local

Oracle Secret Store Tool : Version 12.1.0.1

Copyright (c) 2004, 2012, Oracle and/or itsaffiliates. All rights reserved.

Enter password:         

Enter password again:         

$

然后,在创建一个和 TNS 别名相关的认证项。参数为 ”aliaSUSErname password”.

$ mkstore -wrl”/u01/app/oracle/wallet” -createCredential pdb1_test test test

Oracle Secret Store Tool : Version 12.1.0.1

Copyright (c) 2004, 2012, Oracle and/or itsaffiliates. All rights reserved.

Enter wallet password:         

Create credentialoracle.security.client.connect_string1

$

在 ”$ORACLE_HOME/network/admin/tnsnames.ora” 文件中创建一个和钱包中匹配的别名。

PDB1_TEST =

 (DESCRIPTION =

  (ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121.localdomain)(PORT = 1521))

  (CONNECT_DATA =

    (SERVER = DEDICATED)

    (SERVICE_NAME = pdb1)

    )

  )

至此,我们就可以用钱包中的认证项去连接确定的数据库。

$ sqlplus /@pdb1_test

SQL*Plus: Release 12.1.0.1.0 Production onSat Apr 19 10:19:38 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Sat Apr 19 201410:18:52 +01:00

Connected to:

Oracle Database 12c Enterprise Edition Release12.1.0.1.0 – 64bit Production

With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

SQL> SHOW USER

USER is “TEST”

SQL> SHOW CON_NAME

CON_NAME

——————————

PDB1

SQL>

4.        调度器

Oracle12c 中的调度器已被增强,以便可以包含基于脚本的任务,这样,你就可以定义行内脚本,或在文件系统上调用脚本。这些是外部任务的一个变种,但 SQL_SCRIPT 和 BACKUP_SCRIPT 任务类型使得处理认证和多宿主环境变得 更加容易。

catcon.pl

当在多宿主环境运行脚本时,DBA 遇到的另一个问题是在多个 PDBS 中运行同样的脚本。这可以通过前面的方法实现,但 Oracle 提供的叫 ”catcon.pl” 的 PERL 模块也许更加方便。

在多宿主环境中,有些 Oracle 提供的脚本必须按照特定顺序执行,先在 CDB$ROOT 容器中执行。”catcon.pl” 模块可以完成它,并且提供确定容器的日志,这样,你可以很容易的检查任务完成情况。

该模块的完整语法如下,不带参数运行该模块会显示所有的用法。

$ perl catcon.pl

 Usage: catcon  [-uusername[/password]] [-U username[/password]]

                [-d directory] [-l directory]

                [{-c|-C} container] [-pdegree-of-parallelism]

                [-e] [-s]

                [-E { ON |errorlogging-table-other-than-SPERRORLOG} ]

                [-g]

                -b log-file-name-base

                —

                {sqlplus-script [arguments] |–x } …

  Optional:

    -uusername (optional /password; otherwise prompts for password)

      used to connect to the database to run user-supplied scripts or

      SQL statements

        defaults to “/ as sysdba”

    -Uusername (optional /password; otherwise prompts for password)

      used to connect to the database to perform internal tasks

      defaults to “/ as sysdba”

    -ddirectory containing the file to be run

    -ldirectory to use for spool log files

    -ccontainer(s) in which to run sqlplus scripts, i.e. skip all

      Containers not named here; for example,

        -c ‘PDB1 PDB2’,

    -Ccontainer(s) in which NOT to run sqlplus scripts, i.e. skip all

      Containers named here; for example,

        -C ‘CDB PDB3’

      NOTE: -c and -C are mutually exclusive

    -pexpected number of concurrent invocations of this script on a given

      host

      NOTE: this parameter rarely needs to be specified

    -esets echo on while running sqlplus scripts

    -soutput of running every script will be spooled into a file whose name

      will be

        __[].

    -Esets errorlogging on; if ON is specified, default error logging table

      will be used, otherwise, specified error logging table (which must

      have been created in every Container) will be used

    -gturns on production of debugging info while running this script

  Mandatory:

    -bbase name (e.g. catcon_test) for log and spool file names

     

    sqlplus-script – sqlplus script to run OR

    SQL-statement  – a statement toexecute

  NOTES:

    -if –x is the first non-option string, it needs to be

      preceeded with — to avoid confusing module parsing options into

      assuming that ‘-‘ is an option which that module is not expecting and

      about which it will complain

    -command line parameters to SQL scripts can be introduced using –p

      interactive (or secret) parameters to SQL scripts can be introduced

      using –P

    For example,

      perl catcon.pl … x.sql ‘–pJohn’ ‘–PEnter Password for John:’ …

$

关于运行 Oracle 提供的脚本,手册中使用了在所有容器中运行 ”catblock.sql” 脚本的例子。

$ . oraenv

ORACLE_SID = [cdb1] ?

The Oracle base remains unchanged with value/u01/app/oracle

$ cd $ORACLE_HOME/rdbms/admin/

$ perl catcon.pl -d $ORACLE_HOME/rdbms/admin-b /tmp/catblock_output catblock.sql

$ ls /tmp/catblock_output*

catblock_output0.log  catblock_output1.log  catblock_output2.log  catblock_output3.log

$

第一个输出文件包含了来自 ”cdb$root” and “pdb$seed” 容器的输出。最后一个文件包含了该任务的整体状态输出信息。中间的其他文件包含了所有用户自己创建的 PDBS 的输出。

“catcon.pl” 模块也能用来在 CDB 中所有容器中运行查询。下面的命令在所有容器中运行一个查询,针对每个容器,其信息将会输出到名为 ”/tmp/tbs_files_outputN.log” 的文件中。

$ cd $ORACLE_HOME/rdbms/admin/

$ perl catcon.pl -e -b /tmp/tbs_files_output– –x”SELECT tablespace_name,file_name FROM dba_data_files”

$ ls /tmp/tbs_files_output*

/tmp/tbs_files_output0.log  /tmp/tbs_files_output1.log  /tmp/tbs_files_output2.log  /tmp/tbs_files_output3.log

$

通过 ”-c” 选项和 ”-C” 选项,你可以包含和排除特定的 PDBS。下例通过漏掉 root 和 seed 容器来在所有用户定义的容器中运行一个查询。

$ rm -f /tmp/tbs_files_output*

$ cd $ORACLE_HOME/rdbms/admin/

$ perl catcon.pl -e -C ‘CDB$ROOT PDB$SEED’ -b/tmp/tbs_files_output — –x”SELECT tablespace_name,file_name FROM dba_data_files”

$

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-01/140028.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计6904字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中