mysql 备份命令

mysql 备份常用备份命令整理

mysql 常用备份命令

# 备份单个数据库
mysqldump -u root -p database_name > database_backup.sql

# 备份多个数据库
mysqldump -u root -p --databases database1 database2 > multiple_databases.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_databases.sql

# 备份时排除某些表
mysqldump -u root -p database_name --ignore-table=database_name.table1 --ignore-table=database_name.table2 > backup.sql

# 备份时使用压缩
mysqldump -u root -p database_name | gzip > database_backup.sql.gz

# 备份时设置 GTID
# 注意:GTID 备份需要在支持 GTID 的 MySQL 版本中
# 这样生成的备份文件不会包含GTID信息,可以避免导入时的冲突
mysqldump --set-gtid-purged=OFF -u username -p database_name > backup.sql

备份 k8s 上的 MySQL

# 以下为备份脚本,mysql_backup.sh,内容如下

#!/bin/bash
#将k8s-mysql数据备份到主机的指定目录下

# 设置数据库实例名称和信息
NS=istorm-one-base
DB_USER="root"
DB_PASS="password"

DB_INSTANCE_NAME=$(kubectl -n $NS get po | awk '{print $1}' | grep mysql)
DBS=$(kubectl -n $NS  exec $DB_INSTANCE_NAME -- sh -c 'mysql -u'$DB_USER' -p'$DB_PASS'  -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)"')

#创建备份目录
mkdir -p /opt/mysql_bak/$(date +"%Y-%m-%d")_backup_sql
SQL_DATA="/opt/mysql_bak/$(date +"%Y-%m-%d")_backup_sql"

# 遍历备份每个数据库
for db_name in $DBS
do
    # 备份数据库
   echo  "Backing up database ===========>>> $db_name"
    kubectl -n $NS  exec $DB_INSTANCE_NAME -- sh -c 'mysqldump -u'$DB_USER' -p'$DB_PASS' '$db_name' > /tmp/'$db_name'-backup.sql' > /dev/null 
   
    # 将备份文件拷贝到本地
    kubectl -n $NS cp $DB_INSTANCE_NAME:/tmp/$db_name-backup.sql $SQL_DATA/$db_name.sql > /dev/null
    
    # 清理数据库实例中的备份文件
    kubectl -n $NS exec $DB_INSTANCE_NAME -- sh -c 'rm /tmp/'$db_name'-backup.sql'
done
echo -e "\033[41;37m -------------备份完成,请查看$SQL_DATA目录------------- \033[0m"

恢复 k8s 上的 MySQL

# 以下为恢复脚本,mysql_restore.sh,内容如下

#!/bin/bash
#将主机的指定目录下的k8s-mysql数据恢复到k8s上
# 设置数据库实例名称和信息
NS=cnbr-server
DB_USER="root"
DB_PASS="password"
DB_INSTANCE_NAME=$(kubectl -n $NS get po | awk '{print $1}' | grep mysql-cluster-mysql-0)

# 恢复指定目录下的备份文件
TIME_STAMP=$(date +"%Y-%m-%d")
DB_BACKUP_DIR="/opt/mysql_bak/${TIME_STAMP}_backup_sql"

# 建库、拷贝文件、导入数据
for db_file in $(ls $DB_BACKUP_DIR);do
    db_name=$(echo $db_file | awk -F'.' '{print $1}')
    echo "Restoring database ===========>>> $db_name"
    db_file=$(basename $db_file)
    db_path=${DB_BACKUP_DIR}/${db_file}
    
    # 创建数据库
    kubectl -n $NS exec $DB_INSTANCE_NAME -c mysql -- sh -c "mysql -u$DB_USER -p$DB_PASS -e \"CREATE DATABASE IF NOT EXISTS ${db_name};\""
    
    # 将备份文件拷贝到容器中
    kubectl -n $NS cp ${db_path} $DB_INSTANCE_NAME:/tmp/$db_file -c mysql > /dev/null
    
    # 导入数据
    kubectl -n $NS exec $DB_INSTANCE_NAME -c mysql -- sh -c "mysql -u${DB_USER} -p${DB_PASS} ${db_name} < /tmp/${db_file}
    
    # 清理容器中的备份文件
    # kubectl -n $NS exec $DB_INSTANCE_NAME -- sh -c 'rm /tmp/'$db_file
done
echo -e "\033[41;37m -------------恢复完成------------- \033[0m"
···