当前位置: 首页 > article >正文

数据库参数备份

MySQL

#!/bin/bash
# 获取当前日期和时间的时间戳
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")

# 0、创建目录
mkdir /tmp/parameter_$TIMESTAMP/

# 1、获取所有命名空间
echo "1、获取所有命名空间"
NAMESPACES=$(kubectl get ns | grep qfusion- | grep -v qfusion-cloudshell | awk '{print $1}')
CONTAINER=mysql

# 2、遍历所有命名空间,获取MySQL实例的参数
echo "2、遍历所有命名空间,获取MySQL实例的参数"
for NAMESPACE in $NAMESPACES; do
  echo "Processing namespace: $NAMESPACE"
  # 在每个命名空间中查找名称以 'mysql-' 开头的 Pod
  for pod in $(kubectl get pods -n "$NAMESPACE" -o=jsonpath='{.items[*].metadata.name}' | grep '^mysql-'); do
    echo "Processing pod: $pod in namespace: $NAMESPACE"
    # 执行 mysql 命令并将输出保存到带有时间戳的文件
    kubectl exec -it "$pod" -n "$NAMESPACE" -c "$CONTAINER" -- bash -c 'mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "show variables \G;"' > "/tmp/parameter_$TIMESTAMP/${pod}_${TIMESTAMP}.csv" 2>/dev/null
  done
done

# 3、查看是否打印成功
echo "3、查看是否打印成功"
echo ""
ls -l /tmp/parameter_$TIMESTAMP/
head -n 2 /tmp/parameter_$TIMESTAMP/*.csv

在这里插入图片描述

MongoDB

#!/bin/bash
# 获取当前日期和时间的时间戳
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")


# 0、创建带有时间戳的目录
mkdir /tmp/parameter_$TIMESTAMP/

# 1、获取所有命名空间
echo "1、获取所有命名空间"
#NAMESPACES=$(kubectl get ns -o=jsonpath='{.items[*].metadata.name}')
NAMESPACES=$(kubectl get ns | grep qfusion- | grep -v qfusion-cloudshell | awk '{print $1}')
CONTAINER=mongod

# 2、遍历所有命名空间,获取MongoDB实例的参数
echo "2、遍历所有命名空间,获取MongoDB实例的参数"
for NAMESPACE in $NAMESPACES; do
  echo "Processing namespace: $NAMESPACE"
  # 在每个命名空间中查找名称以 'mongo-' 开头的 Pod
  for pod in $(kubectl get pods -n "$NAMESPACE"  | grep '^mongo-' | awk '{print $1}'); do
    echo "Processing pod: $pod in namespace: $NAMESPACE"
    # 执行 mongos 命令并将输出保存到带有时间戳的文件
    # 假设每个Pod中只有一个容器,如果多个容器需要指定容器名称
    if echo "$pod" | grep -q 'mongos'; then
      kubectl exec -it "$pod" -n "$NAMESPACE" -c mongod -- bash -c 'cat /etc/mongos.conf' > "/tmp/parameter_$TIMESTAMP/${pod}.csv" 2>/dev/null
    else
      kubectl exec -it "$pod" -n "$NAMESPACE" -c mongod -- bash -c 'cat /etc/mongod.conf' >> "/tmp/parameter_$TIMESTAMP/${pod}.csv" 2>/dev/null
    fi
  done
done

# 3、查看是否打印成功
echo "3、查看是否打印成功"
echo ""
#ls -l /tmp/parameter_$TIMESTAMP/

grep max /tmp/parameter_$TIMESTAMP/*.csv

在这里插入图片描述

Oracle

#!/bin/bash

# 获取所有命名空间
NAMESPACES=$(kubectl get ns | grep qfusion- | grep -v qfusion-cloudshell | awk '{print $1}')

# 遍历所有命名空间
for namespace in $NAMESPACES; do
    # 获取命名空间下所有名称中包含 'oracle' 的 Pod
    pods=$(kubectl get pods -n "$namespace"  | grep '^oracle-' | awk '{print $1}')

    # 遍历所有 Oracle Pod
    for pod in $pods; do
        echo 
        cluster=${pod%-*}
        cluster=${cluster::-1}
        echo "处理命名空间 $namespace 下的实例 $pod"
        
        # 获取数据库版本和SID
        DATABASE_VERSION=$(kubectl get pod -n $namespace $pod -o jsonpath='{.spec.containers[0].env[?(@.name=="DATABASE_VERSION")].value}')
        ORACLE_SID=$(kubectl get pod -n $namespace $pod -o jsonpath='{.spec.containers[0].env[?(@.name=="ORACLE_SID")].value}')

        # 获取实例sys密码
        secret_name="${cluster}0-root" # 确保这是正确的Secret名称
        pwd=$(kubectl get secret -n $namespace $secret_name -o jsonpath='{.data.password}' | base64 --decode)

        # 获取实例IP信息
        # 这里假设你有一个名为 <pod>-vip 的服务,你需要根据你的实际服务名称来替换
        ipaddr=$(kubectl get lb -n $namespace | grep $cluster | awk '{print $2}')
        port=$(kubectl get lb -n $namespace | grep $cluster | awk '{print $3}')

        # 获取当前时间戳
        timestamp=$(date +%Y%m%d_%H%M%S)
        output_file="parameters_${pod}_${namespace}_${timestamp}.txt"
        echo "将输出保存到文件: $output_file"

        # 执行 SQL*Plus 命令并重定向输出到文件
        su - oracle -c "sqlplus sys/$pwd@$ipaddr:$port/$ORACLE_SID as sysdba <<EOF
        SET PAGESIZE 999;
        SET LINESIZE 999;
        SET FEEDBACK OFF;
        SET HEADING OFF;
        SET TRIMSPOOL ON;
        SET LONG 9999;
        SET LONGCHUNKSIZE 9999;
        SET TRIMSPOOL ON;
        SET SERVEROUTPUT ON;
        SET TRIM ON;
        SET TAB OFF;
        SET FEEDBACK OFF;
        SET HEADING OFF;

        COLUMN NAME FORMAT A30;
        COLUMN TYPE FORMAT A20;
        COLUMN VALUE FORMAT A100;

        SELECT name, type, value FROM v\\\$parameter;
        EXIT;
EOF" > "$output_file"

        echo "输出已保存到 $output_file"
    done
done

在这里插入图片描述

单个实例参数备份

#!/bin/bash

if [ -z "$1" ]; then
    echo "未知参数,用法: $0 [Pod名称] [命名空间]"
    exit 1
fi

pod=$1
cluster=${pod%-*}
if [ -z "$2" ]; then
    namespace="qfusion-admin"
else
    namespace=$2
fi

echo "实例 $1 $2 的信息如下:"

database=${cluster%-*}
if [ "$database" == "oracle" ]; then

    # 查看实例版本和SID
    DATABASE_VERSION=$(kubectl get pod -n $namespace $pod -o jsonpath='{.spec.containers[0].env[?(@.name=="DATABASE_VERSION")].value}')
    echo "实例版本 $DATABASE_VERSION"

    ORACLE_SID=$(kubectl get pod -n $namespace $pod -o jsonpath='{.spec.containers[0].env[?(@.name=="ORACLE_SID")].value}')
    echo "实例SID $ORACLE_SID"

    # 查看实例sys密码
    secret_name="${cluster}-root" # 确保这是正确的Secret名称
    pwd=$(kubectl get secret -n $namespace $secret_name -o jsonpath='{.data.password}' | base64 --decode)
    echo "密码 $pwd"

    # 查看实例IP信息
    ipaddr=$(kubectl get lb -n $namespace | grep $cluster | awk '{print $2}')
    port=$(kubectl get lb -n $namespace | grep $cluster | awk '{print $3}')
    echo "实例VIP $ipaddr:$port"

    # 输出连接串
    echo "连接串 sqlplus sys/$pwd@$ipaddr:$port/$ORACLE_SID as sysdba"

    # 执行 SQL*Plus 命令并重定向输出到文件
    timestamp=$(date +%Y%m%d_%H%M%S)
    output_file="parameters_${pod}_${timestamp}.txt"
    echo "将输出保存到文件: $output_file"
    su - oracle -c "sqlplus sys/$pwd@$ipaddr:$port/$ORACLE_SID as sysdba <<EOF
    SET PAGESIZE 999;
    SET LINESIZE 999;
    SET FEEDBACK OFF;
    SET HEADING OFF;
    SET TRIMSPOOL ON;
    SET LONG 9999;
    SET LONGCHUNKSIZE 9999;
    SET TRIMSPOOL ON;
    SET SERVEROUTPUT ON;
    SET TRIM ON;
    SET TAB OFF;
    SET FEEDBACK OFF;
    SET HEADING OFF;

    COLUMN NAME FORMAT A30;
    COLUMN TYPE FORMAT A20;
    COLUMN VALUE FORMAT A100;

    SELECT name, type, value FROM v\\\$parameter;
    show parameter
    EXIT;
EOF" > "$output_file"

    echo "输出已保存到 $output_file"

else
    echo "该数据库类型暂不支持"
fi

获取实例信息脚本

#!/bin/bash

if [ -z "$1" ]; then
    echo "未知参数,用法: $0 [Pod名称] [命名空间]"
    exit 1
fi
pod=$1
pod=${pod%-*}
if [ -z "$2" ]; then
    namespace="qfusion-admin"
else
    namespace=$2
fi

database=${pod%-*}
if [ "$database" == "oracle" ]; then

    # 查看实例SID
    ORACLE_SID=$(kubectl get pod -n $namespace $pod-0 -o jsonpath='{.spec.containers[0].env[?(@.name=="ORACLE_SID")].value}')
    echo "实例SID $ORACLE_SID"

    # 查看实例sys密码
    secret_name="$pod-root" # 确保这是正确的Secret名称
    pwd=$(kubectl get secret -n $namespace $secret_name -o jsonpath='{.data.password}' | base64 --decode)
    echo "密码  $pwd"

    # 查看实例IP信息
    ipaddr=`kubectl get lb -n $namespace | grep $pod | awk '{print$2}'`
    port=`kubectl get lb -n $namespace | grep $pod | awk '{print$3}'`
    echo "实例vip $ipaddr:$port"

    # 输出连接串
    echo "sqlplus sys/$pwd@$ipaddr:$port/$ORACLE_SID as sysdba"
else
    echo "该数据库类型暂不支持"
fi

http://www.kler.cn/a/393525.html

相关文章:

  • C++--------效率和表示
  • 攻防世界web第三题file_include
  • [Python机器学习]:Anaconda3实践环境安装和使用
  • 每天五分钟机器学习:核函数
  • VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件
  • 007-spring-bean的相关配置(重要)
  • 爬虫开发工具与环境搭建——开发工具介绍
  • Spring Boot——日志介绍和配置
  • LeetCode 3249.统计好节点的数目:深度优先搜索(DFS)
  • WPF 中的视觉层和逻辑层有什么区别?
  • 问题(十九)JavaAgent-ByteBuddy与CGLIB字节码增强冲突问题
  • 基于Java Springboot高校实验室管理系统
  • SpringBoot(二)集成mybatis
  • WPF-控件的属性值的类型转化
  • CSS教程(七)- 背景
  • python语言基础-4 常用模块-4.11 OS库
  • LINUX系统中的挂载(Mounting)
  • Nuxt3
  • YoloV10改进策略:Block改进|VOLO,视觉识别中的视觉展望器|即插即用|附代码+改进方法
  • kafka 在Linux安上的装部署
  • 定时任务进行简单监控、爬虫的自动化之旅
  • LeetCode:540. 有序数组中的单一元素(二分 Java)
  • ReactPress与WordPress:两大开源发布平台的对比与选择
  • 【计算机网络】TCP网络程序
  • 【LLM学习笔记】第三篇:模型微调及LoRA介绍(附PyTorch实例)
  • 有什么好用的 WebSocket 调试工具吗?