首页 > IT职业 > IT职场 > 面向 DBA 的 Linux Shell 脚本简介
7 年前,Oracle 发布了 Linux 上的第一个商业数据库。从那时起,Oracle、Red Hat 和 Novell/SUSE 就不断地合作更改 Linux 内核,从而提高数据库和应用程序的性能。正因为这样,用于 Linux 的 Oracle 数据库
7 年前,Oracle 发布了 Linux 上的第一个商业数据库。从那时起,Oracle、Red Hat 和 Novell/SUSE 就不断地合作更改 Linux 内核,从而提高数据库和应用程序的性能。正因为这样,用于 Linux 的 Oracle 数据库
以往,系统管理员与 DBA 之间在职责方面存在差别。但实际上,这种差别通常并不明显。许多 IT 部门雇佣一些可解决数据库级以及操作系统级问题的员工。当然,Oracle 数据库本身使用操作系统资源,并能与其环境紧密交互。此外,许多系统管理员和 DBA 发现将其工作相关的任务自动化很有必要或比较方便。软件安装、系统资源监视以及系统管理涉及一些重复和容易出错的任务,而自动过程可以比手动过程更好地完成这些任务。
将这些任务自动化的方法之一是 shell 脚本。Shell 脚本自 Linux 系统安装之初就起着重要作用。启动和关闭系统时就会调用各种脚本。Oracle 和其他第三方供应商的实用程序也是通过 shell 脚本可调用的。由于这些脚本可以快速开发,因此历来就用它们构建应用程序原型。系统管理员已利用通过 shell 脚本实现的功能提供针对其监视的系统的特定要求和特征定制的解决方案了。
在本文中,我将介绍“bash”shell 脚本可以实现的、与在 Linux 平台上安装、运行和维护 Oracle 数据库相关的功能。注意,本文适用于 Linux 脚本初学者或对 Linux 相对陌生的 DBA;对大多数经验丰富的 Linux 系统管理员则不适用。
Shell 脚本是什么?
shell 脚本是一个包含命令序列的文本文件。当运行文件(或脚本)时,将执行该文件中包含的命令。术语 shell 仅指与 Linux 内核通信所使用的特定命令行用户界面。目前有多个不同的 shell,其中包括 C shell (csh)、Korn shell (ksh)、Bourne shell (sh) 和 Bourne-Again shell (bash)。shell 本身就是一个从文件或终端读取命令、解释这些命令并通常执行其他命令的命令。Bourne-Again shell 合并了上述其他 shell 的特性,本文就使用该脚本进行演示。
脚本文件中的第一行可用于指定使用哪个 shell 来运行该脚本。以下是所有脚本示例中包含的第一行的含义:
#!/bin/bash
为什么使用 Shell 脚本?
由于 shell 脚本与 DBA 的工作相关,因此您可能不会马上看到 shell 脚本的价值,这跟您的工作经历有关。如果您以前从未使用过 UNIX 或类似 UNIX 的系统,那么可能会对大量含义晦涩的命令感到一愁莫展。此外,除了作为关系数据库外,Oracle
但您会发现几个探究 shell 脚本领域的原因,其中包括:
什么情况下不 使用 Shell 脚本
Oracle 数据库包含了超出 RDBMS 传统定义的功能。与软件的任何其他部分一样,它使用操作系统提供的资源,但它所“看到”并“更改”其环境的程度远远超过了其他软件。SQL 和 Oracle 的固定视图从数据库内部提供了系统视图,而 shell 脚本从数据库外部提供了系统视图。Shell 脚本并不是适用于所有问题的解决方案。
必须意识到,操作系统的许多方面可以从数据库内部进行监视和修改。可以使用 Oracle 的固定视图(带 v$ 前缀的视图)确定计算机的主机名 (v$instance) 或数据库正在其中运行的平台的名称 (v$database)。还可以通过这种方式确定与数据库相关的文件的位置和其他属性。可以直接从数据库中查询数据文件(v$datafile、dba_data_files)、临时文件(v$tempfile、dba_temp_files)、重做日志 (v$logfile)、存档日志 (v$archived_log) 和控制文件 (v$controlfile) 的位置和其他属性。可以通过该视图以及通过查看某些 init.ora 参数(db_recovery_file_dest、db_recovery_file_dest_size)确定有关闪回恢复区 ($recovery_file_dest) 的信息。还可以查询进程 (v$process) 和内存(v$sga、v$sgastat 等)的状态。有各种内置的 PL/SQL 程序包,并能够创建允许对底层 OS 进行其他访问的 Java 和 C 数据库对象。
如果您正在考虑为一个需要大量数据库访问的任务编写脚本,则脚本可能并不是最佳选择。本文的稍后部分将介绍如何使用 SQL*Plus 访问数据库,但在很多情况下,使用其他语言可以更好地解决此问题。
下表归纳了可以从数据库中访问的信息:
服务器/操作系统信息
服务器标识 | 典型查询 | 附注 |
实例运行在的主机的名称 | select host_name | 也可以通过从 bash 运行以下命令来获得该信息: hostname 或 uname –n |
操作系统平台 | select platform_name from v$database –-( | 如果运行 uname –s,则将返回类似信息 |
文件信息
Oracle 文件位置 | 典型查询 | 附注 |
控制文件 | select name | 数据库控制文件的位置。init.ora 的参数 control_files 也包含该信息。 |
数据文件 | select file_name | 数据库数据文件的位置 |
临时文件 | select file_name | 数据库临时文件的位置 |
日志文件 | select member | 重做日志的位置 |
归档日志 | select name | 归档重做日志的位置。init.ora 的参数 log_archive_dest_n 也包含该信息。如果数据库不在 Archivelog 模式下,则该查询将不返回结果。 |
闪回恢复区 | select name | Oracle |
由参数指示的文件系统上的其他访问点 | select * where value like '%/%' 或 value like '%/%'; | 根据 Oracle 数据库安装和版本的不同,该查询的结果可能迥然不同。可能返回的参数有: spfile |
用编程的方式访问文件系统 | select directory_path from dba_directories | 可以使用 Oracle UTL_FILE_DIR 参数和 DIRECTORY 数据库对象访问标准数据库功能以外的文件。 |
进程信息
处理器/进程 | 典型查询 | 附注 |
会话进程 | select p.spid, s.username, s.program from v$process p, v$session s where p.addr=s.paddr order by 2, 3, 1 | 可以将 spid 与 ps –ef 结果相关联,以将数据库中的可用信息与给定进程的操作系统信息进行比较。 |
与并行相关的进程 | select slave_name, status | Oracle 数据库的很多方面(如加载、查询、对象创建、恢复和复制)都可以利用并行来加快可以分割的活动。参数 parallel_threads_per_cpu 设置实例的默认并行度。 |
内存信息
内存 | 典型查询 | 附注 |
程序全局区 | select * from V$PGASTAT | 参数 pga_aggregate_target 用于为所有专用服务器连接配置内存。 可以使用 vmstat 和 top 等 Linux 实用程序监视内存使用情况。 |
系统全局区 | select * from v$sga | SGA_MAX_SIZE 和 SGA_TARGET 参数用于配置 Oracle 数据库 同时,还有各种 Linux 实用程序可用于监视内存分配。 |
BASH 脚本
脚本要么作为自动进程的一部分被调用(无需人为干预),要么以交互方式运行(用户根据提示执行操作)。只要您拥有文件的执行权限,便可以从命令行键入该文件的名称来运行它。如果您没有文件的执行权限,但拥有其读取权限,则可以通过在脚本的前面加上 sh 来运行该脚本。
如果脚本设计为在无用户输入的情况下运行,则可以使用多种可选方法调用它。可以在后台运行脚本,即使在断开连接的情况下,您仍可以通过输入以下形式的命令来运行:
nohup /path_to_dir/myscript_here.sh &
这对于需要很长时间才能完成的脚本很有用。at 命令可用于在将来执行脚本,而 cron 可用于计划要重复执行的脚本。
以下示例介绍了提供视图输出(使用 echo)、循环、条件逻辑以及变量赋值等重要方面。
print_args.sh。参数是位于命令名右侧并传递到脚本中的词。要访问第一个参数,使用 $1 变量。$0 变量包含脚本本身的名称。$# 变量包含脚本中的参数个数。一种迭代所传递的所有参数的便捷方法是使用 while 循环和 shift 命令。该命令使您可以迭代参数列表中的所有参数(而非保持无限循环)。
while [ $# -ne 0 ]
do
echo $1
shift
done
如果脚本将文件名作为参数(或提示用户输入文件名)并在后面读取该文件,则建议您检查其访问性和可读性。例如,涉及选择备份控制文件的恢复脚本可能提示用户选择将在脚本后面部分中用于恢复文件的备份控制文件。
if [ !-r $1 ]; then # not exists and is readable
echo "File $1 does not exist or is not readable."
exit;
fi
字符序列
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9099175/viewspace-902675/
,如需转载,请注明出处,否则将追究法律责任。