DBA使用Shell完成自动化相关工作
Posted DB架构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DBA使用Shell完成自动化相关工作相关的知识,希望对你有一定的参考价值。
-
数据库备份和恢复: Shell脚本可以自动化数据库备份和恢复的过程,以及在备份和恢复过程中需要执行的其他操作,例如将备份文件传输到远程服务器等。
数据库进行备份的脚本:
以下是一个示例 Oracle 19c 数据库备份脚本,该脚本将备份数据库并将备份文件传输到远程服务器。您可以使用 cron 作业调度器定期运行此脚本。
#!/bin/bash
# set backup and log file paths
BACKUP_DIR=/opt/oracle/backup
LOG_FILE=/opt/oracle/backup.log
# set remote server details
REMOTE_HOST=remote-server.example.com
REMOTE_USER=username
REMOTE_DIR=/backup
# run backup using RMAN
rman target / << EOF >> $LOG_FILE
run
allocate channel ch1 type disk;
backup as compressed backupset database plus archivelog delete input;
release channel ch1;
EOF
# check if backup was successful
if [ $? -eq 0 ]; then
echo "Backup completed successfully on $(date)." >> $LOG_FILE
# transfer backup file to remote server
scp $BACKUP_DIR/*.bkp $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR
# check if transfer was successful
if [ $? -eq 0 ]; then
echo "Backup file transfer to remote server completed successfully on $(date)." >> $LOG_FILE
else
echo "Error: Backup file transfer to remote server failed on $(date)." >> $LOG_FILE
fi
else
echo "Error: Backup failed on $(date)." >> $LOG_FILE
fi
请注意,此脚本使用了相同的备份命令和传输命令作为之前示例中的脚本,但是在此示例中,它被封装在一个 shell 脚本中以便自动化。根据需要修改脚本来适应您自己的环境和需求。
接下来,您需要配置计划任务来定期运行此脚本。为了每天晚上11点运行备份脚本,请使用以下命令来编辑当前用户的 crontab 文件:
crontab -e
然后添加以下行:
0 23 * * * /path/to/backup/script.sh
这将导致脚本每天晚上11点运行一次,并在完成备份和传输之后将输出写入日志文件中。
数据库进行恢复的脚本:
以下是一个示例 Oracle 19c 数据库恢复脚本,该脚本将使用 RMAN 工具来恢复数据库。在运行此脚本之前,请确保您已经创建了备份并知道要恢复的时间点。
#!/bin/bash
# set log file path
LOG_FILE=/opt/oracle/recovery.log
# specify recovery target time
RECOVERY_TIME="TO_DATE('2022-03-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS')"
# run recovery using RMAN
rman target / << EOF >> $LOG_FILE
run
set until time $RECOVERY_TIME;
restore database;
recover database;
EOF
# check if recovery was successful
if [ $? -eq 0 ]; then
echo "Recovery completed successfully on $(date)." >> $LOG_FILE
else
echo "Error: Recovery failed on $(date)." >> $LOG_FILE
fi
请注意,在此示例中,我们通过设置
RECOVERY_TIME
变量来指定需要恢复到的时间点。这个变量应该设置为正确的时间点,以确保只恢复到所需的时间点。此脚本还将输出写入日志文件中,以便您可以随时检查恢复操作的结果和状态。根据需要修改脚本来适应您自己的环境和需求。
2.数据库监控和维护: Shell脚本可以通过定期运行SQL脚本和检查日志文件等方式来监控数据库的性能和健康状况,并在发现异常情况时执行相关维护操作,例如重新启动数据库实例、清理临时文件等。
以下是一个示例监控脚本,它将定期运行 SQL 脚本并检查日志文件以监视数据库性能和健康状况。如果发现异常情况,脚本将执行相关维护操作,例如重新启动数据库实例、清理临时文件等。
#!/bin/bash
# set log file path
LOG_FILE=/opt/oracle/monitor.log
# run SQL script
sqlplus -s /nolog << EOF >> $LOG_FILE
connect username/password@database_name;
@/path/to/sql/script.sql;
EOF
# check log file for errors or warnings
if grep -q "ORA-" $LOG_FILE; then
echo "Warning: SQL script generated errors or warnings on $(date)." >> $LOG_FILE
fi
# check alert log file for errors or warnings
ALERT_LOG=/opt/oracle/diag/rdbms/database_name/trace/alert_database_name.log
if grep -q "ORA-" $ALERT_LOG; then
echo "Warning: Alert log file contains errors or warnings on $(date)." >> $LOG_FILE
fi
# perform maintenance if necessary
if [ -n "$(grep 'ORA-00020' $ALERT_LOG)" ]; then
echo "Database instance is hung. Restarting database..." >> $LOG_FILE
systemctl restart oracle
fi
if [ -n "$(find /opt/oracle/admin/tmp -type f -mtime +7)" ]; then
echo "Cleaning up temporary files..." >> $LOG_FILE
rm /opt/oracle/admin/tmp/*
fi
请注意,在此示例中,我们使用了相同的方法来运行 SQL 脚本并检查日志文件。如果发现异常情况,脚本将执行相关的维护操作。例如,如果发现数据库实例挂起,脚本将重启数据库实例;如果发现临时文件夹中的文件超过 7 天未使用,脚本将删除它们。
根据需要修改脚本来适应您自己的环境和需求。要定期运行此脚本,请使用以下命令来编辑当前用户的 crontab 文件:
crontab -e
然后添加以下行:
0 0 * * * /path/to/monitor/script.sh
这将导致脚本每天午夜12点运行一次,并在完成运行之后将输出写入日志文件中。
3.系统管理和自动化运维: Shell脚本可以编写系统管理工具并进行自动化运维,例如检查磁盘空间、删除过期的日志文件、执行定期维护任务等。
以下是一个示例系统管理工具脚本,它将检查磁盘空间、删除过期的日志文件,执行定期维护任务等。您可以使用此脚本来自动化运维操作,并根据需要进行修改以满足特定需求。
#!/bin/bash
# check disk space usage
DISK_THRESHOLD=90 # set the threshold in %
DISK_USAGE=$(df -h / | awk 'print $5' | tail -n1 | tr -d '%')
if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
echo "Warning: Disk space usage is above $DISK_THRESHOLD%" >&2
fi
# delete old log files
LOG_DIR=/var/log/your-app
DAYS_TO_KEEP=7
find "$LOG_DIR" -type f -mtime +"$DAYS_TO_KEEP" -delete
# run regular maintenance tasks
# ...
echo "$(date) - System management tasks completed." >> /var/log/sysadmin.log
在上述示例中:
- 我们使用
df
命令来获取磁盘空间使用情况,并将其与预设的阈值比较。- 使用
find
命令来删除指定目录中早于指定天数的文件。- 在完成所有任务后,我们将消息写入系统日志文件。
要使用此脚本进行自动化运维操作,请将其命名为
sysadmin-tool.sh
或类似的名称,并将其放置在适当的位置(例如/usr/local/bin
)。然后,您可以将此脚本添加到计划任务中,以便定期运行。
要编辑当前用户的 crontab 文件,请使用以下命令:
crontab -e
然后,添加以下行以每小时运行一次:
0 * * * * /usr/local/bin/sysadmin-tool.sh
根据需要修改脚本来适应您自己的环境和需求,例如更改目标目录、更改保存日志文件的位置、增加其他维护任务等。
4.安装和部署: Shell脚本可以自动化安装和部署Oracle数据库和相关应用程序,例如通过命令行界面或安装向导安装Oracle软件、创建数据库实例、分配权限等。
以下是一个示例 Oracle 数据库自动化安装和部署脚本,该脚本可以通过命令行界面或安装向导来安装 Oracle 软件、创建数据库实例并分配权限。
#!/bin/bash
# set variables for installation
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
DB_NAME=mydb
DB_SID=mydb
DB_PORT=1521
INSTALL_FILE="LINUX.X64_193000_db_home.zip"
INSTALL_DIR="/tmp/install"
# create installation directory if it doesn't exist
mkdir -p "$INSTALL_DIR"
# download the Oracle software installation file
echo "Downloading Oracle software installation file..."
cd "$INSTALL_DIR" || exit
wget https://download.oracle.com/otn/linux/oracle19c/"$INSTALL_FILE"
# extract and install Oracle software
unzip -q "$INSTALL_FILE"
cd "database" || exit
./runInstaller \\
-silent \\
-responseFile "$INSTALL_DIR/response/db_install.rsp" \\
-ignoreSysPrereqs \\
-waitForCompletion \\
-showProgress
# create a new database
echo "Creating Oracle database instance..."
dbca -silent \\
-createDatabase \\
-templateName General_Purpose.dbc \\
-gdbname "$DB_NAME" \\
-sid "$DB_SID" \\
-sysPassword oracle \\
-systemPassword oracle \\
-emConfiguration NONE \\
-datafileDestination /u01/app/oracle/oradata \\
-characterSet AL32UTF8 \\
-totalMemory 2048 \\
-memoryPercentage 25 \\
-redoLogFileSize 50 \\
-sampleSchema true \\
-enableArchive true
# set environment variables
echo "Setting environment variables for Oracle software..."
echo "export ORACLE_HOME=$ORACLE_HOME" >> /etc/profile.d/oracle.sh
echo "export ORACLE_BASE=$ORACLE_BASE" >> /etc/profile.d/oracle.sh
echo "export PATH=$PATH:$ORACLE_HOME/bin" >> /etc/profile.d/oracle.sh
source /etc/profile.d/oracle.sh
# configure listener and TNS names
echo "Configuring listener and TNS names..."
lsnrctl start
echo "LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = $DB_PORT))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = $DB_NAME)
(SID_NAME = $DB_SID)
(ORACLE_HOME = $ORACLE_HOME)
)
)
" > "$ORACLE_HOME/network/admin/listener.ora"
echo "
$DB_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = $DB_PORT))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = $DB_SID)
)
)
" > "$ORACLE_HOME/network/admin/tnsnames.ora"
# grant required privileges
echo "Granting permissions to Oracle users..."
sqlplus -s / as sysdba <<EOF
ALTER USER SYS IDENTIFIED BY oracle;
ALTER USER SYSTEM IDENTIFIED BY oracle;
GRANT CONNECT, RESOURCE, DBA TO username;
EXIT;
EOF
echo "Oracle database installation and configuration completed successfully."
在上述示例中:
- 我们设置了变量以指定 Oracle 安装的位置、数据库名称、SID、端口等。
- 下载并解压 Oracle 安装文件,并使用
runInstaller
命令进行安装。- 使用
dbca
命令创建新的数据库实例。- 设置环境变量以便让系统找到 Oracle 软件。
- 配置监听器和 TNS 名称,使其能够连接到数据库实例。
- 最后,使用
sqlplus
命令授予必要的权限。根据需要修改脚本来适应您自己的环境和需求。例如,更改变量以适应您的安装路径和参数,添加其他自定义配置等。
请注意,在运行此脚本之前,您需要先为当前用户授权以执行所有必要操作,例如安装软件、创建数据库等。例如,使用以下命令将当前用户添加到
dba
组中:
sudo usermod -aG dba "$(whoami)"
然后,您可以运行此脚本进行自动化 Oracle 数据库安装和部署。注意,在运行脚本前,请务必备份系统和数据。
如果您需要通过交互式方式安装 Oracle 软件和创建新的数据库实例,则可以基于上述脚本编写一个包含提示语句的脚本。例如:
#!/bin/bash
# prompt for installation details
read -p "Enter the Oracle home directory name (default: /u01/app/oracle/product/19.0.0/dbhome_1): " ORACLE_HOME
ORACLE_HOME=$ORACLE_HOME:-/u01/app/oracle/product/19.0.0/dbhome_1
read -p "Enter the Oracle base directory name (default: /u01/app/oracle): " ORACLE_BASE
ORACLE_BASE=$ORACLE_BASE:-/u01/app/oracle
read -p "Enter the database name (default: mydb): " DB_NAME
DB_NAME=$DB_NAME:-mydb
read -p "Enter the database SID (default: mydb): " DB_SID
DB_SID=$DB_SID:-mydb
read -p "Enter the database port number (default: 1521): " DB_PORT
DB_PORT=$DB_PORT:-1521
# download and extract the Oracle software installation file
echo "Downloading Oracle software installation file..."
cd "/tmp" || exit
read -p "Enter the Oracle software installation file URL: " SOFTWARE_URL
wget "$SOFTWARE_URL"
INSTALL_FILE=$(ls LINUX.X64_*.zip)
unzip -q "$INSTALL_FILE"
# install Oracle software
echo "Installing Oracle software..."
cd "database" || exit
./runInstaller
# create a new database
echo "Creating Oracle database instance..."
dbca
# set environment variables
echo "Setting environment variables for Oracle software..."
echo "export ORACLE_HOME=$ORACLE_HOME" >> /etc/profile.d/oracle.sh
echo "export ORACLE_BASE=$ORACLE_BASE" >> /etc/profile.d/oracle.sh
echo "export PATH=$PATH:$ORACLE_HOME/bin" >> /etc/profile.d/oracle.sh
source /etc/profile.d/oracle.sh
# configure listener and TNS names
echo "Configuring listener and TNS names..."
lsnrctl start
echo "LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = $DB_PORT))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = $DB_NAME)
(SID_NAME = $DB_SID)
(ORACLE_HOME = $ORACLE_HOME)
)
)
" > "$ORACLE_HOME/network/admin/listener.ora"
echo "
$DB_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = $DB_PORT))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = $DB_SID)
)
)
" > "$ORACLE_HOME/network/admin/tnsnames.ora"
# grant required privileges
echo "Granting permissions to Oracle users..."
sqlplus -s / as sysdba <<EOF
ALTER USER SYS IDENTIFIED BY oracle;
ALTER USER SYSTEM IDENTIFIED BY oracle;
GRANT CONNECT, RESOURCE, DBA TO username;
EXIT;
EOF
echo "Oracle database installation and configuration completed successfully."
在此示例中,我们添加了几个提示语句来引导用户输入所需的安装信息(例如 Oracle Home 目录、数据库名称等)。用户可以根据自己的需求更改这些信息。然后,脚本将下载并解压 Oracle 安装文件,并使用交互式方式安装 Oracle 软件和创建新的数据库实例。
请注意,在运行此脚本之前,您需要先为当前用户授权以执行所有必要操作,例如安装软件、创建数据库等。另外,此脚本需要用户手动输入一些信息,因此不能完全自动化。
5.其他任务: Shell脚本还可以用于执行其他与Oracle数据库相关的任务,例如数据迁移、用户管理、权限分配等。
以下是一个示例 Oracle 数据库管理脚本,它可以执行数据迁移、用户管理和权限分配等任务。
#!/bin/bash
# set variables for data migration
SOURCE_DB=mydb1
SOURCE_SCHEMA=schema1
TARGET_DB=mydb2
TARGET_SCHEMA=schema2
TABLES=(table1 table2 table3)
# migrate data from source database to target database
echo "Migrating data from $SOURCE_SCHEMA in $SOURCE_DB to $TARGET_SCHEMA in $TARGET_DB..."
for table in "$TABLES[@]"; do
expdp "'/ as sysdba'" \\
directory=DATA_PUMP_DIR \\
schemas=$SOURCE_SCHEMA \\
tables=$table \\
dumpfile=$table.dmp \\
logfile=$table.log
impdp "'/ as sysdba'" \\
directory=DATA_PUMP_DIR \\
remap_schema=$SOURCE_SCHEMA:$TARGET_SCHEMA \\
dumpfile=$table.dmp \\
logfile=$table_imp.log \\
exclude=INDEX,CONSTRAINT
done
# create a new user and grant privileges
NEW_USER=new_user
NEW_PASSWORD=password123
echo "Creating new user $NEW_USER..."
sqlplus -s / as sysdba <<EOF
CREATE USER $NEW_USER IDENTIFIED BY "$NEW_PASSWORD";
GRANT CONNECT, RESOURCE, DBA TO $NEW_USER;
EXIT;
EOF
# grant privileges to existing users
EXISTING_USERS=(user1 user2 user3)
PRIVILEGES=(SELECT INSERT UPDATE DELETE)
echo "Granting privileges to existing users..."
for user in "$EXISTING_USERS[@]"; do
for priv in "$PRIVILEGES[@]"; do
sqlplus -s / as sysdba <<EOF
GRANT $priv ON schema1.table1 TO $user;
GRANT $priv ON schema1.table2 TO $user;
GRANT $priv ON schema1.table3 TO $user;
EXIT;
EOF
done
done
echo "Oracle database management tasks completed successfully."
在上述示例中:
- 我们使用
expdp
和impdp
命令从源数据库中导出表的数据,并将其导入到目标数据库中。- 我们创建了一个新的用户并为其授予连接和 DBA 权限,然后将 SELECT、INSERT、UPDATE 和 DELETE 权限授予现有用户。
根据需要修改脚本来适应您自己的环境和需求。例如,更改变量以适应您的数据库名称、用户名、密码等,修改数据迁移的表列表,添加其他用户管理和权限分配任务等。
请注意,在运行此脚本之前,请务必备份系统和数据。同时确保当前用户具有足够的权限来执行所有必要操作。
shell 脚本发送邮件
有时候会使用脚本完成一系列的自动化工作,工作完成后还需要邮件通知相关人员,此时可以使用第三方的工具:SendEmail,最新版本sendEmail-v1.56.tar.gz
下载地址:http://caspian.dotconf.net/menu/Software/SendEmail/
sendEmil的使用范例:
#!/bin/bash email_reciver="oneway@163.com lin@126.com" #发送者邮箱 email_sender=373850874@qq.com #邮箱用户名 email_username=373850874 #邮箱密码 #使用qq邮箱进行发送需要注意:首先需要开启:POP3/SMTP服务,其次发送邮件的密码需要使用在开启POP3/SMTP服务时候腾讯提供的第三方客户端登陆码。 email_password=mialbjhzsmuobigf file1_path="附件一路径" file2_path="附件二路径" #smtp服务器地址 email_smtphost=smtp.qq.com email_title="iOS客户端更新" email_content="谢谢!" ./sendEmail -f ${email_sender} -t ${email_reciver} -s ${email_smtphost} -u ${email_title} -xu ${email_username} -xp ${email_password} -m ${email_content} -a ${file1_path} ${file2_path} -o message-charset=utf-8
问题 1
要使用脚本发送邮件,必须设置发送邮箱开启IMAP/SMTP服务。否则将会报错。
IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。
IMAP和POP有什么区别?
POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件、标记已读等),这是不会反馈到服务器上的,比如:您通过电子邮件客户端收取了QQ邮箱中的3封邮件并移动到了其他文件夹,这些移动动作是不会反馈到服务器上的,也就是说,QQ邮箱服务器上的这些邮件是没有同时被移动的 。但是IMAP就不同了,电子邮件客户端的操作都会反馈到服务器上,您对邮件进行的操作(如:移动邮件、标记已读等),服务器上的邮件也会做相应的动作。也就是说,IMAP是“双向”的。
同时,IMAP可以只下载邮件的主题,只有当您真正需要的时候,才会下载邮件的所有内容。
问题 2
我使用的系统是Mac OSX EI Capitan, 运行命令时报错如下:
MaxOS: invalid SSL_version specified at /System/Library/Perl/Extras /5.18/IO/Socket/SSL.pm line 368.
解决方案:
打开文件: /usr/share/perl5/IO/Socket/SSL.pm
找到: m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1(?:_?[12])?))$}i
替换为:m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i
可是接下来的问题又出现了,当你修改完成后却无法保存,被告知权限不够,可是你明明使用的是sudo,超级管理员权限。
这是由于 OSX EI Capitan之后苹果采用了“Rootless”技术来保护系统内核,用户将没有权限操作系统文件。但是不要紧
苹果并没有把路封死。
执行以下命令:
% dsenableroot username = wangwei user password: root password: verify root password: dsenableroot:: ***Successfully enabled root user.
命令执行后可以使sudo 获取正真的Root用户权限。sudo root用户的密码就是你刚刚设置的密码。
如果你希望自己的账户拥有root权限,那么你也可以通过添加 -U 参数来达到这一目的:
dsenableroot -u wangwei
#其中wangwei为你的用户名
此时你就可以更改/usr/share/perl5/IO/Socket/SSL.pm了。
关于root权限问题,苹果既然使用了Rootless技术来保护内核虽然给我们造成了一些麻烦,但是一定是有他的道理的,比如更加安全,防止了误操作等。
所以我们获取到最高权限后,最好再取消Root权限
取消用户的Root权限
取消用户Root权限只需要在命令后加参数:-d (disable)
% dsenableroot -d username = wangwei (或者是root) user password: dsenableroot:: ***Successfully disabled root user.
取消特定用户的Root权限:
dsenableroot -d -u wangwei
关闭“Rootless”
sudo nvram boot-args="rootless=0"; sudo reboot
以上是关于DBA使用Shell完成自动化相关工作的主要内容,如果未能解决你的问题,请参考以下文章