Python帮助DBA所做的自动化工作

 

  1. 数据库备份和恢复:使用Python可以编写自动化脚本,定期备份数据库并在需要时恢复数据。

以下是一个示例Python脚本,用于定期备份和恢复Oracle数据库,并命名为oracle_backup_restore.py。请注意,这只是一个示例脚本,具体实现可能因环境而异,请根据实际情况进行修改。

import os
import datetime

# 数据库连接参数
db_user = 'your_db_user'
db_password = 'your_db_password'
db_host = 'your_db_host'
db_port = 'your_db_port'
db_sid = 'your_db_sid'

# 备份目录路径
backup_path = '/path/to/backup/directory/'

# 获取当前时间
now = datetime.datetime.now()

# 拼接备份文件名
backup_file_name = now.strftime('%Y-%m-%d-%H-%M-%S') + '.dmp'

# 构造备份命令
backup_command = f'exp {db_user}/{db_password}@{db_host}:{db_port}/{db_sid} file={backup_path}{backup_file_name}'

# 执行备份命令
os.system(backup_command)

# 模拟数据损坏或误删除
# 删除数据文件或者修改其中的内容
data_file_path = '/path/to/data/file'
with open(data_file_path, 'w') as f:
    f.write('Some corrupted or deleted data')

# 构造恢复命令(以最新备份文件为例)
restore_file_path = backup_path + backup_file_name
restore_command = f'imp {db_user}/{db_password}@{db_host}:{db_port}/{db_sid} file={restore_file_path} full=y'

# 执行恢复命令
os.system(restore_command)

# 恢复完毕后,将数据文件恢复到正常状态
with open(data_file_path, 'w') as f:
    f.write('Normal data')

以上代码会将备份文件输出到指定目录,命名方式为当前时间,并在需要时从该目录中选择最新备份进行恢复。为了展示恢复流程,我们在代码中模拟了一些数据损坏或误删除的情况,在执行恢复命令前,首先需要将数据文件恢复到正常状态。

需要注意的是,在执行脚本前,确保您已安装Oracle客户端,并且已经正确配置了环境变量。另外,使用此脚本进行自动化备份和恢复可能需要DBA的授权。

2.监控数据库性能:通过Python编写监控脚本,可以实时监测数据库的性能和健康状况,及时发现并解决问题。

以下是一个示例Python脚本,用于实时监测Oracle数据库的性能和健康状况,并命名为oracle_monitor.py。请注意,这只是一个示例脚本,具体实现可能因环境而异,请根据实际情况进行修改。

import cx_Oracle
import time

# 数据库连接参数
db_user = 'your_db_user'
db_password = 'your_db_password'
db_host = 'your_db_host'
db_port = 'your_db_port'
db_sid = 'your_db_sid'

# 监控间隔时间(单位:秒)
monitor_interval = 60

# 连接数据库
dsn_tns = cx_Oracle.makedsn(db_host, db_port, db_sid)
conn = cx_Oracle.connect(db_user, db_password, dsn_tns)

while True:
    try:
        # 获取当前时间
        now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

        # 获取数据库会话信息
        curs1 = conn.cursor()
        curs1.execute('SELECT count(*) FROM v$session')
        session_count = curs1.fetchone()[0]
        curs1.close()

        # 获取表空间使用情况
        curs2 = conn.cursor()
        curs2.execute('SELECT df.tablespace_name, (df.total_space - fs.free_space) used_space, fs.free_space '
                      'FROM (SELECT tablespace_name, SUM(bytes) free_space FROM dba_free_space GROUP BY tablespace_name) fs, '
                      '(SELECT tablespace_name, SUM(bytes) total_space FROM dba_data_files GROUP BY tablespace_name) df '
                      'WHERE fs.tablespace_name = df.tablespace_name')
        tablespace_info = curs2.fetchall()
        curs2.close()

        # 输出监控信息
        print(f'[{now}] Session count: {session_count}')
        for t in tablespace_info:
            tablespace_name = t[0]
            used_space = int(t[1] / 1024 / 1024)
            free_space = int(t[2] / 1024 / 1024)
            total_space = used_space + free_space
            usage_percent = round(used_space / total_space * 100, 2)
            print(f'[{now}] Tablespace "{tablespace_name}": '
                  f'Total {total_space} MB, Used {used_space} MB ({usage_percent}%), Free {free_space} MB')

        # 等待一段时间后再次监控
        time.sleep(monitor_interval)

    except Exception as e:
        # 出现异常时输出错误信息,并等待一段时间后重新连接数据库
        print(f'[{now}] Error occurred: {e}')
        time.sleep(monitor_interval)
        conn = cx_Oracle.connect(db_user, db_password, dsn_tns)

 

以上代码会实时监测数据库会话数和表空间使用情况,并输出监控信息。在检测到异常情况时会输出错误信息,并等待一段时间后重新连接数据库。

需要注意的是,在执行脚本前,确保您已安装Oracle客户端,并且已经正确配置了环境变量。另外,使用此脚本进行自动化监控可能需要DBA的授权。

3.数据库迁移:利用Python编写脚本,将数据从一个数据库迁移到另一个数据库。

以下是一个示例Python脚本,用于自动化迁移Oracle数据库,并命名为oracle_migration.py。请注意,这只是一个示例脚本,具体实现可能因环境和需求而异,请根据实际情况进行修改。

import cx_Oracle

# 源数据库连接参数
src_db_user = 'your_src_db_user'
src_db_password = 'your_src_db_password'
src_db_host = 'your_src_db_host'
src_db_port = 'your_src_db_port'
src_db_sid = 'your_src_db_sid'

# 目标数据库连接参数
dest_db_user = 'your_dest_db_user'
dest_db_password = 'your_dest_db_password'
dest_db_host = 'your_dest_db_host'
dest_db_port = 'your_dest_db_port'
dest_db_sid = 'your_dest_db_sid'

# 导出数据文件路径
export_path = '/path/to/export/directory/'

# 构造导出命令(使用expdp)
export_command = f'expdp {src_db_user}/{src_db_password}@{src_db_host}:{src_db_port}/{src_db_sid} ' \
                 f'directory=EXPDP_DIR dumpfile=data.dmp logfile=expdp.log'

# 执行导出命令
conn1 = cx_Oracle.connect(src_db_user, src_db_password, f'{src_db_host}:{src_db_port}/{src_db_sid}')
curs1 = conn1.cursor()
curs1.execute(export_command)
curs1.close()
conn1.close()

# 移动导出文件到目标服务器
import shutil
shutil.move(f'{export_path}/data.dmp', f'{export_path}/data.dmp')

# 构造导入命令(使用impdp)
import_command = f'impdp {dest_db_user}/{dest_db_password}@{dest_db_host}:{dest_db_port}/{dest_db_sid} ' \
                 f'directory=IMPDP_DIR dumpfile=data.dmp logfile=impdp.log'

# 执行导入命令
conn2 = cx_Oracle.connect(dest_db_user, dest_db_password, f'{dest_db_host}:{dest_db_port}/{dest_db_sid}')
curs2 = conn2.cursor()
curs2.execute(import_command)
curs2.close()
conn2.close()

以上代码会先在源数据库上执行导出命令,将数据导出为一个文件,然后通过移动文件的方式将该文件传输到目标服务器上,并在目标数据库上执行导入命令,将数据导入到目标数据库中。

需要注意的是,在执行脚本前,确保您已安装Oracle客户端,并且已经正确配置了环境变量和导出/导入目录。另外,使用此脚本进行自动化迁移可能需要DBA的授权。

4.自动化管理:利用Python编写脚本,自动化管理数据库,例如创建和删除用户、分配权限等。

以下是一个示例Python脚本,用于自动化管理Oracle数据库用户和权限,并命名为oracle_user_permission.py。请注意,这只是一个示例脚本,具体实现可能因环境和需求而异,请根据实际情况进行修改。

import cx_Oracle

# 数据库连接参数
db_user = 'your_db_user'
db_password = 'your_db_password'
db_host = 'your_db_host'
db_port = 'your_db_port'
db_sid = 'your_db_sid'

# 新用户信息
new_user = 'new_user'
new_password = 'new_password'

# 构造创建新用户的SQL语句
create_user_sql = f'CREATE USER {new_user} IDENTIFIED BY {new_password} DEFAULT TABLESPACE USERS'

# 构造分配权限的SQL语句(可根据需要修改)
grant_sql_list = [
    f'GRANT CREATE SESSION TO {new_user}',
    f'GRANT CONNECT, RESOURCE TO {new_user}',
    f'GRANT UNLIMITED TABLESPACE TO {new_user}'
]

# 连接数据库并执行SQL语句
conn = cx_Oracle.connect(db_user, db_password, f'{db_host}:{db_port}/{db_sid}')
curs = conn.cursor()

# 创建新用户
curs.execute(create_user_sql)

# 分配权限
for grant_sql in grant_sql_list:
    curs.execute(grant_sql)

# 提交事务并关闭游标和连接
conn.commit()
curs.close()
conn.close()

# 构造删除用户的SQL语句
drop_user_sql = f'DROP USER {new_user} CASCADE'

# 连接数据库并执行SQL语句
conn = cx_Oracle.connect(db_user, db_password, f'{db_host}:{db_port}/{db_sid}')
curs = conn.cursor()

# 删除用户
curs.execute(drop_user_sql)

# 提交事务并关闭游标和连接
conn.commit()
curs.close()
conn.close()

以上代码会先创建一个新用户,并分配一些权限,然后再删除该用户。您可以根据需要修改创建用户和分配权限的SQL语句。

需要注意的是,在执行脚本前,确保您已安装Oracle客户端,并且已经正确配置了环境变量。另外,使用此脚本进行自动化管理用户和权限可能需要DBA的授权。

5.数据分析:利用Python编写脚本,对数据库中的数据进行统计、分析和可视化。

以下是一个示例Python脚本,用于对Oracle数据库中的数据进行统计、分析和可视化,并命名为oracle_data_analysis.py。请注意,这只是一个示例脚本,具体实现可能因环境和需求而异,请根据实际情况进行修改。

import cx_Oracle
import pandas as pd
import matplotlib.pyplot as plt

# 数据库连接参数
db_user = 'your_db_user'
db_password = 'your_db_password'
db_host = 'your_db_host'
db_port = 'your_db_port'
db_sid = 'your_db_sid'

# 构造查询语句
query_sql = 'SELECT department_name, AVG(salary) avg_salary FROM employees e ' \
            'JOIN departments d ON e.department_id = d.department_id GROUP BY department_name'

# 连接数据库查询数据
conn = cx_Oracle.connect(db_user, db_password, f'{db_host}:{db_port}/{db_sid}')
data = pd.read_sql(query_sql, conn)

# 绘制柱状图并保存
plt.bar(data['DEPARTMENT_NAME'], data['AVG_SALARY'])
plt.xticks(rotation=45)
plt.savefig('department_avg_salary.png')

# 输出结果
print(data)

# 关闭连接
conn.close()

以上代码会先查询数据库中所有部门的平均工资,并使用Pandas和Matplotlib将结果绘制成柱状图并保存为一张图片。最后输出查询结果。

需要注意的是,在执行脚本前,确保您已安装Oracle客户端,并且已经正确配置了环境变量和相关数据包。另外,使用此脚本进行数据统计、分析和可视化可能需要DBA的授权。

6.基础设施管理:通过Python编写脚本,可以自动化运维工作,例如检查磁盘空间、系统日志等。

以下是一个示例Python脚本,用于自动化运维Oracle数据库,并命名为oracle_automation.py。请注意,这只是一个示例脚本,具体实现可能因环境和需求而异,请根据实际情况进行修改。

import os
import shutil
import smtplib
import subprocess
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

# SMTP服务器地址、端口、用户名和密码
smtp_server = 'your_smtp_server'
smtp_port = 25
smtp_user = 'your_smtp_user'
smtp_password = 'your_smtp_password'

# 发件人和收件人信息
from_addr = 'your_email_address'
to_addrs = ['recipient1@example.com', 'recipient2@example.com']

# 要检查的日志文件路径
log_path = '/path/to/log/file'

# 要检查的磁盘挂载点
mount_point = '/mnt/data'

# 检查磁盘空间是否充足
def check_disk_space():
    df_output = subprocess.check_output(['df', '-h']).decode('utf-8')
    for line in df_output.split('\n'):
        if mount_point in line:
            _, _, _, used, _, _ = line.split()
            used_percent = float(used[:-1])
            if used_percent > 80:
                send_warning_email(f'Disk space usage over 80%: {used}')

# 检查系统日志是否有错误信息
def check_system_log():
    error_count = 0
    for filename in os.listdir(log_path):
        if filename.endswith('.log'):
            with open(os.path.join(log_path, filename), 'r') as f:
                for line in f:
                    if 'ERROR' in line:
                        error_count += 1
    if error_count > 0:
        send_warning_email(f'System log has {error_count} errors')

# 发送警告邮件
def send_warning_email(content):
    msg = MIMEMultipart()
    msg['From'] = from_addr
    msg['To'] = ', '.join(to_addrs)
    msg['Subject'] = 'Warning: Oracle Automation Script'
    text = MIMEText(content)
    msg.attach(text)
    smtp_server = smtplib.SMTP(smtp_server, smtp_port)
    smtp_server.login(smtp_user, smtp_password)
    smtp_server.sendmail(from_addr, to_addrs, msg.as_string())
    smtp_server.quit()

# 主程序入口
if __name__ == '__main__':
    check_disk_space()
    check_system_log()

以上代码会定期检查系统中指定磁盘挂载点的使用情况以及指定日志文件是否有错误信息,并在有异常情况时通过SMTP协议发送一封警告邮件给DBA。

需要注意的是,在执行脚本前,确保您已经安装了相关依赖包(例如subprocessshutilsmtplib等),并且已经正确配置了SMTP服务器参数和发件人/收件人信息。另外,使用此脚本进行自动化运维可能需要DBA的授权。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值