数据库参数备份

MySQL

csharp 复制代码
#!/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

csharp 复制代码
#!/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

csharp 复制代码
#!/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

单个实例参数备份

csharp 复制代码
#!/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

获取实例信息脚本

csharp 复制代码
#!/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
相关推荐
SPC的存折4 分钟前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
仲芒5 分钟前
[24年单独笔记] MySQL 常用的 DML 命令
数据库·笔记·mysql
SPC的存折18 分钟前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
蓦然乍醒33 分钟前
使用 DBeaver 还原 PostgreSQL 备份文件 (.bak) 技术文档
数据库·postgresql
XDHCOM33 分钟前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
QCzblack35 分钟前
BugKu BUUCTF ——Reverse
java·前端·数据库
cyber_两只龙宝38 分钟前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
luis的妙妙屋39 分钟前
主流数据库数据类型对比分析
数据库
XDHCOM1 小时前
ORA-00054资源忙故障修复,远程处理Oracle报错解决方案,数据库锁超时NOWAIT指定问题排查
数据库·oracle
q21030633721 小时前
初学Access(具体示例)
数据库