MySQL基础信息:
version > 8.0.28
datadir > /usr/local/mysql/data
备份是个好习惯
/opt/xtrabackup8/bin/xtrabackup --defaults-file=/etc/my.cnf --backup --parallel=4 --user=root --password=123 --target-dir=/backup/`date +'%Y%m%d%H'`
误操作将MySQL的datadir目录给删除
rm -rf /usr/local/mysql/data
若是数据库已经关闭,只能通过备份进行恢复;若是还存活,可以通过下面操作进行恢复。
登录数据库,锁定数据库
-- 设置数据库只读
SET GLOBAL read_only = 1;
-- 锁表阻止写入
FLUSH TABLES WITH READ LOCK;
提取删除的文件信息
lsof | grep deleted | grep "/usr/local/mysql/data" | grep mysqld | awk '{print $2, $4, $9}' >> del_file_01.txt
lsof | grep deleted | grep "/usr/local/mysql/data" | grep -v mysqld | awk '{print $2, $5, $10}' >> del_file_01.txt
sort del_file_01.txt | uniq > del_file.txt
注意:去掉del_file.txt文件中第二列全是字母的行
基于del_file.txt文件通过执行下面的脚本,生成cp命令
#!/bin/bash
# 输入文件
input_file="del_file.txt"
# 输出文件
output_file="processed_file.txt"
# 临时文件,用于存储目录列表
dir_list="dir_list.txt"
# 清空输出文件和目录列表文件
> "$output_file"
> "$dir_list"
# 处理文件内容
while IFS=' ' read -r col1 col2 col3; do
# 提取第二列的数字部分
col2_num=$(echo "$col2" | sed 's/[a-zA-Z]//g')
# 构造新的第一列和第二列
new_col1="cp /proc/$col1/"
new_col2="fd/$col2_num"
# 写入到输出文件
echo "$new_col1$new_col2 $col3" >> "$output_file"
# 提取目录部分并写入到目录列表文件
dir=$(dirname "$col3")
echo "$dir" >> "$dir_list"
done < "$input_file"
# 去重目录列表
sort -u "$dir_list" -o "$dir_list"
# 创建目录
while IFS= read -r dir; do
mkdir -p "$dir"
done < "$dir_list"
# 删除临时文件
rm "$dir_list"
echo "处理完成,结果保存在 $output_file"
执行processed_file.txt中的cp命令
补充datadir目录下缺少的系统库子目录
mkdir -p /usr/local/mysql/data/{mysql,performance_schema}
>> 若是没有mysql这个系统库,启动会报错。<<
客户端关闭MySQL服务
> shutdown ;
对datadir目录重新授权
chown -R mysql.mysql /usr/local/mysql/data
重启MySQL服务以及登录验证
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




