今天,我服务器上的mysql被攻击了,其他数据库全没了,多了一个数据库recover_data数据库,我点开数据库看了一下,里面存了一句勒索的话,如果要恢复数据,访问某网址支付比特币,大概是要勒索我18000块左右的人民币。瞬间人麻了,顿时给我敲响了一个警钟,数据安全不是等开发好项目上线后才考虑,而是在项目落地的那一刻起就要重视起来,打战粮草先行,开发安全先做。话不多说,解决问题!
使用MySQL的二进制日志:
如果你启用了MySQL的二进制日志(binlog
),你可以使用这些日志文件来恢复数据。二进制日志记录了所有对数据库的更改,你可以将这些日志应用到当前数据库中来恢复数据。具体步骤包括:
mysqlbinlog
工具将日志应用到数据库中。使用InnoDB的undo日志:
对于使用InnoDB存储引擎的表,InnoDB会在内部维护undo日志。虽然这些日志主要用于事务回滚,但在一些情况下,也可能用于恢复数据。这种方法非常复杂且不总是有效,通常需要借助专业工具或技术支持。
恢复数据的第三方工具:
有一些第三方数据恢复工具可以尝试从损坏的数据库文件中恢复数据。比如:MySQL Recovery Tools
:这些工具可以分析损坏的数据库文件,尝试恢复表数据。Percona Data Recovery Tools
:Percona 提供了一些用于数据恢复的工具和方法。
检查操作系统的文件系统快照:
如果你使用的是文件系统支持快照功能(如ZFS、Btrfs等),可以检查是否有快照可用于恢复数据。
寻求专业团队帮助:
如果数据非常重要且上述方法无法解决问题,考虑寻求专业的数据恢复服务,他们可能会有更多的工具和技术来尝试恢复数据。
为了避免数据丢失问题,建议定期备份数据库,并将备份保存在安全的地方。设置自动备份机制可以显著降低数据丢失的风险。
log-bin
=/usr/local/log/mysql-binbinlog_format
=mixedserver-id
= 1log-bin=binlog
日志的存放路径binlog_format
有三种方式分别为:server-id
= 1:server-id
是 MySQL 配置中的一个参数,用于唯一标识每个 MySQL 服务器实例。设置 server-id = 1
的意思是将当前 MySQL 服务器的 ID 设置为 1。server-id
。mysqlbinlog --stop-datetime=“2024-08-12 19:16:10” /www/server/data/mysql-bin.000034 > /tmp/recovery.sql
如果报错mysqlbinlog: command not found 有两个原因导致:export PATH=$PATH:/mysqlbinlog的存放路径
例如export PATH=$PATH:/usr/local/mysql/bin/mysqlbinlog
然后esc :wq保存并退出source 你的profile路径
例如:source /etc/profile 即可使配置生效,验证:输入mysqlbinlog出现如下图所示即为配置成功!sudo systemctl start firewalld
启动 firewalld 服务。sudo systemctl enable firewalld
设置开机自启动。sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
,查看确认规则已添加sudo firewall-cmd --list-all
如下图所示即为你开放的端口public class MysqlBackupUtil { public static void backupData(String host, int port, String username, String password, String database, String backupDirectoryPath) throws IOException { String command = String.format("mysqldump -h %s -P %d -u %s -p%s %s -r %s", host, port, username, password, database, backupDirectoryPath); Process process = Runtime.getRuntime().exec(command); int exitCode; try { exitCode = process.waitFor(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException("备份过程被中断", e); } if (exitCode != 0) { throw new IOException("备份 MySQL 数据失败"); } } public static void backupTableData(String host, int port, String username, String password, String database, String backupDirectoryPath,String tables ) throws IOException { String command = String.format("mysqldump -h %s -P %d -u %s -p%s %s -r %s %s", host, port, username, password, database, backupDirectoryPath,tables); Process process = Runtime.getRuntime().exec(command); int exitCode; try { exitCode = process.waitFor(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException("备份过程被中断", e); } if (exitCode != 0) { throw new IOException("备份 MySQL 数据失败"); } } }
数据库备份的定时任务实现方法
public void MysqlBackupTask(String host,Integer port,String username, String password,String database,String backupDirectoryPath) { try { MysqlBackupUtil.backupData(host, port, username, password, database, backupDirectoryPath); try { uploadFile(backupDirectoryPath); deleteTableFile(backupDirectoryPath,-2); } catch (Exception e) { throw new RuntimeException(e); } } catch (IOException e) { throw new RuntimeException(e); } } public void MysqlBackupTableTask(String host,Integer port,String username,String password,String database, String backupDirectoryPath,String tables) { try { MysqlBackupUtil.backupTableData(host, port, username, password, database, backupDirectoryPath,tables); try { uploadFile(backupDirectoryPath); deleteTableFile(backupDirectoryPath,-1); } catch (Exception e) { throw new RuntimeException(e); } } catch (Exception e) { throw new RuntimeException(e); } } public void uploadFile(String backupDirectoryPath) throws Exception { String endpoint ="服务器endpoint"; // 例如:http://oss-cn-hangzhou.aliyuncs.com String accessKeyId = "这里填你自己的服务器accessKeyId"; String accessKeySecret ="这里填你自己的服务器accessKeySecret"; String bucketName = "服务器bucket桶名称"; String objectName = backupDirectoryPath+"/"+ DateUtils.datePath()+"/"+backupDirectoryPath; // 上传到 OSS 后的文件名 String localFilePath = backupDirectoryPath; // 本地文件路径 // 创建 OSSClient 实例 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件到服务器oss ossClient.putObject(bucketName, objectName, new File(localFilePath)); // 关闭 OSSClient ossClient.shutdown(); }
当我们发现数据库被黑时
如果某一天你也很不幸数据库被黑客攻击了,不要慌,我们首先要做的就是把损失降到最低,先把数据恢复,然后备份数据,在清理环境,做数据安全防护措施,千万不要点击黑客的连接,对其付款进行恢复数据,这不是解决问题的办法,黑客可能还会继续勒索。继续黑你数据库。我们被黑了数据库是不幸的同时也是幸运的,因为他的攻击只会让我们变得更强,最后我想说,让暴风雨来得更猛烈些吧!!!!