Category

排障复盘

同事误删mysql库补救办法

排障复盘

发现问题

今天下午同事突然跑来找我说不小心把库删了,问我会不会恢复,我从来没有这种删库恢复的经验,自然是要学习一下的,直接开始帮他恢复

查找解决办法

被删库的机器,这儿就叫他243,243的应用和数据库在同一个服务器上

  1. 首先先停止了应用防止继续写入或者丢失服务数据
  2. 检查mysql的binlog是否开启 SHOW VARIABLES LIKE 'log_bin%';,发现是开着的
  3. 检查binlog是否完整 ls /opt/mysql/data/ 发现缺少了几乎一半的binlog,推测是开启了过期清理
  4. 这个时候了解服务器运维的同事提出可以问机房的人恢复硬盘备份,并联系了相关同事
  5. 等待了一段时间,运维同事恢复了前一天的一个备份到一台新机器上,这儿叫他229

解决过程

在等待的时间里,确定了解决方案

  1. 检查两个服务器的binlog id差异
  2. 在243上找到最新的删库的binlog id
  3. 在229上找到最新的binlog id
  4. 在243生成两个binlog id中间差异的sql文件
  5. 将sql文件scp到229服务器上
  6. 229服务器的mysql执行sql补全缺失的数据

其中第二步可以在等待的时候完成

检查binlog的脚本 - 243

纯文本
mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS  --stop-position=287225397  binlog.000075 | tail -n 500 > ~/tail.log
bash
# at 287225397
#260227 15:46:29 server id 1  end_log_pos 287225556 CRC32 0x97e6fb47 	Query	thread_id=663510	exec_time=1	error_code=0	Xid = 583720608
use `laboratory`/*!*/;
SET TIMESTAMP=1772178389/*!*/;
SET @@session.pseudo_thread_id=663510/*!*/;
SET @@session.foreign_key_checks=0/*!*/;
DROP TABLE IF EXISTS `assay_report` /* generated by server */

检查binlog的脚本 - 229

纯文本
mysqlbinlog --no-defaults --database=laboratory ./binlog.000074 > ~/74.sql
bash
# at 1074009846
#260227 10:39:55 server id 1  end_log_pos 1074009890 CRC32 0x5b7eb4ae   Rotate to binlog.000075  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

在243生成差异sql

纯文本
mysqlbinlog --no-defaults --database=laboratory  --skip-gtids  --start-position=256983036 binlog.000074 --stop-position=287225397 binlog.000075 > all.sql

恢复sql

bash
# 登录sql
mysql -u root -p
# 执行文件 (1.5G的all.sql最终执行了十几分钟,服务器是固态硬盘)
source /home/all.sql

最终效果

在下班前恢复完成数据库并准时下班🎉🎉🎉

ps:本次行动由gemini提供技术支持😂

wordpress 非标准端口 https

排障复盘

今天折腾了一天的wordpress,想从http切换到https

首先用acme申请了证书

在wordpress容器到公网之间添加了一个nginx做反代顺便添加https支持

首先遇到的问题是修改站点地址为https后argon的js和css都请求失败,一看发现还都是http

折腾半天找不到配错的地方,最后没写过php也只能硬改代码了,在argon的functions.php里添加了以下代码

javascript
function fix_output_urls($buffer) {
    return str_replace('http://e404.top', 'https://e404.top', $buffer);
}

function start_output_buffer() {
    ob_start("fix_output_urls");
}

add_action('wp_loaded', 'start_output_buffer');

然后就返回了正常的https地址

但是打开管理界面的时候一直重定向到自己

又调试半天,找不到问题原因

只能直接改代码看日志debug

半夜把is_ssl函数改了一下发现能跑了

javascript
function is_ssl() {
	if ( isset( $_SERVER['HTTPS'] ) ) {
		if ( 'on' === strtolower( $_SERVER['HTTPS'] ) ) {
			return true;
		}

		if ( '1' === (string) $_SERVER['HTTPS'] ) {
			return true;
		}
	} elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' === (string) $_SERVER['SERVER_PORT'] ) ) {
		return true;
	}

	return false;
}

第二天发现是wp-config-docker.php原来是需要替换config.php的

修复误损坏/usr的ubuntu

排障复盘

前情提要

在安装telegraf的时候需要复制文件到/etc /usr /var 等目录下,移动文件的时候错误使用了mv usr/* /usr/*的指令,导致系统损坏,缺少bash无法ssh远程连接

尝试远程修复

ssh连不上的情况下发现跑在docker中的容器居然还在正常运行,于是尝试通过portainer新建容器挂在根目录修复,发现portainer会执行宿主机上的可执行文件调用docker,失败

物理机处理

在无法远程修复的情况下只能直接操作物理机修复/备份数据重装。此时物理机/usr目录损坏已经无法重启正常进入系统,启动时显示run-init: can't execute '/sbin/init': No such file or directory,猜测是因为该文件是从/usr/sbin下软链接过来的

使用安装盘进入系统

我的安装盘是rufus创建的,使用的是之前安装系统时的ubuntu 24.04.1 server

首先进入启动盘选择界面,根据教程需要try ubuntu without install然后进入Live 环境,但是server的启动盘中并不包含这个选项,所以直接进入install界面,然后ctrl + alt + f2进入安装器的 BusyBox / Shell

挂载磁盘

使用lsblk指令列出可挂载的磁盘,我的机器中有一块固态和一块机械,固态的主要数据在 /dev/nvme0n1p2,机械的数据在/dev/sdb1,同时我还插入了移动硬盘以便在系统无法修复的情况下直接备份数据,移动硬盘在 /dev/sdc

首先挂载系统盘检查损坏情况mkdir /nvme && mount /dev/nvme0n1p2 /nvme,然后ls /nvme/usr检查损坏情况

非常神奇的,/nvme/usr/bin/nvme/usr/lib/nvme/usr/src没有被删除,于是我直接从安装器的系统中复制了其余的includelib64libexeclocalsbinshare目录到/nvme/usr下,并重启系统,此时正常进入系统

检查系统损坏情况

虽然正常进入了系统,但是并不是所有问题都解决了,首先检查了一些系统服务是否正常运行

dpkg -V | grep -v '^??'列出所有有缺失的包,apt reinstall重新安装确保丢失文件被重新安装

最后安装mariadb的时候忘了指定版本导致启动失败,回忆起以前安装的时候找的对标mysql8的版本,于是卸载自动安装的最新版本换成了mariadb-server=1:10.11.13-0ubuntu0.24.04.1,重启服务后正常运行

检查docker的时候发现docker compose指令不见了,于是重新安装apt install docker-compose-plugin

一天后发现博客无法访问,博客是部署在docker中的wordpress(也就是你现在看到的博客),显示Error establishing a database connection,检查后发现mariadb的默认绑定地址是127.0.0.1,所以无法从容器中访问

后记

至此,系统已修复完成,所有服务都可以正常运行

log4j+slf4j Ignoring binding 的解决方案

排障复盘

SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [jar:file:/F:/AppData/Gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j-impl/2.20.0/7ab4f082fd162f60afcaf2b8744a3d959feab3e8/log4j-slf4j-impl-2.20.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.

引入依赖org.apache.logging.log4j:log4j-slf4j-impl:$_version_时替换为org.apache.logging.log4j:log4j-slf4j2-impl:$_version_

参考官方文档

记录一次MySQL遇到的问题

排障复盘

昨天自己的家里云突然死机,重启之后MySQL启动不了

经过半天的百度,无论怎么设置权限,结果都是Permission denied

最终重装mysql解决

首先备份mysql文件(包括数据文件夹),之后删除原有mysql用户及存放mysql的mysql用户家目录

重新创建mysql用户,下载并初始化mysql

初始化完成后停止mysql服务,将新的mysql的数据文件夹重命名,然后将之前备份的数据文件夹复制过来,复制完成后重新启动mysql服务

完成

Gradle高版本编译时Lombok不起作用

排障复盘

今天使用lombok时出现问题,maven项目能正常使用,拿到gradle里面就出问题,在网上找了一圈,最终解决

解决办法:引入lombok时需要用如下格式

纯文本
dependencies {
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
    compileOnly 'org.projectlombok:lombok:1.18.20'
}

错误的格式(少了 annotationProcessor 'org.projectlombok:lombok:1.18.20'

纯文本
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.20'
}

其他没有生效的方法

打开此选项