docker 的mysql容器中没有mysqlbinlog

docker 的mysql容器中没有mysqlbinlog

bug信息

没有 mysqlbinlog 命令

bash 复制代码
sh: mysqlbinlog: command not found

(tips: MySQL的工具在/usr/bin下)

bash 复制代码
ls -l /usr/bin/my*

原因:阉割版mysql容器,构建者没有把mysqlbinlog当成必需工具,去掉了

解决方法:

思路:

  1. 从官方版没有阉割的容器中将mysqlbinlog工具复制过来
  2. 利用docker的cp,将容器文件经过本机中转到其他容器

(可以省略第一步、第二步,直接下载我复制存储在gitee的mysqlbinlog文件,点击跳转)

bash 复制代码
tips:mysql一些容器版本有自带mysqlbinlog ,一些没有,随手测试了一些版本,如下:
mysql 5.7
	有的:
		mysql:5.7.10(强烈推荐),mysql:5.7.31,mysql:5.7.32
	没有的:
		mysql:5.7.38,mysql:5.7.40,mysql:5.7.42

mysql 8 的好像要debian后缀的才有mysqlbinlog 
只测试了一个 mysql:8.0.32-debian(有的)
bash 复制代码
### 第一步
# 5.7版本 
docker run -d --name=del_mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7.10
# 8.0版本
docker run d --name=del_mysql -e MYSQL_ROOT_PASSWORD=123 mysql:8.0.32-debian

### 第二步
# 随便找个本机地址存放,这里写 / (linux)或者 C:\(windows)
docker cp del_mysql:/usr/bin/mysqlbinlog  C:\
# or
docker cp del_mysql:/usr/bin/mysqlbinlog  /

### 第三步
#复制到你的mysql容器
docker cp c:\mysqlbinlog 你的mysql容器id或者名字:/usr/bin/
# or
docker cp /mysqlbinlog 你的mysql容器id或者名字:/usr/bin/

验证成功

bash 复制代码
# 进入你的容器
docker exec -it 你的容器名 /bin/bash
# 调用mysqlbinlog
mysqlbinlog

#或者不进入,单纯验证
docker exec -it 你的容器名 mysqlbinlog

成功的显示信息:

bash 复制代码
mysqlbinlog  Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Dumps a MySQL binary log in a format usable for viewing or for piping to
the mysql command line client.

Usage: mysqlbinlog [options] log-files
  -?, --help          Display this help and exit.
....(略)

删除无用的文件

bash 复制代码
# 删除没必要的容器
docker rm -f del_mysql
#删除没必要的镜像
docker rmi mysql:5.7.10
# or 
docker rmi mysql:8.0.32-debian

#之后删除本机的文件即可
rm -f /mysqlbinlog
#或者windows(慎重,最好窗口手动删除,而不是命令行,可以两次ctrl c取消执行中的命令)
del C:\mysqlbinlog
# 坑!!! windows的del 
# del C:\mysqlbinlog 和del C:/mysqlbinlog完全不同!
#
# 坑1:del 找不到文件有一定可能会推荐你删除其他文件!!!不细看就会误删
#
# 神坑2:特别是正反斜杠!!!正确的是反斜杠(\)
# 正确:del C:\mysqlbinlog
# 错误,神坑: del C:/mysqlbinlog 只要是正斜杠(/),他直接识别为*,即是目录下全删除,这时会有个是否全删除的提示:
#				C:\*, 是否确认(Y/N)?

5.7开启binlog,(8 的默认开启了)

bash 复制代码
# 编辑配置文件
vim /etc/my.cnf
# 如果没有vim,直接docker cp出来改,再cp回去
# 添加下面几行,(我按照mysql 8的默认配置写的,开启binlog,路径,文件名,索引文件名)
server-id=1		# mysql集群分辨服务的id,必须集群内唯一
log-bin=/var/lib/mysql/binlog 	#如果你不是/var/lib/mysql/文件夹下的,你得确保你的文件夹是mysql群组,mysql用户具有必要的权限(chown chmod)

# 重启mysql容器

验证是否开启

bash 复制代码
# sql语句
show variables like '%log_bin%';

log_bin=ON :打开binlog日志

log_bin_basename=/var/lib/mysql/binlog : binlog日志的文件名前缀

log_bin_index=/var/lib/mysql/binlog.index; binlog文件的索引文件

容器内查看文件

bash 复制代码
ls -l /var/lib/mysql/bin*

关于mysql 5.7的binlog自定义文件夹位置(即自定义log-bin=/var/lib/mysql/binlog ),可以参考下这篇博客:开启mysql 5.7的binlog

5.7版本的mysqlbinlog复制后可能出现的bug

mysqlbinlog: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory

原因:libatomic命令有问题,版本冲突或者没安装,环境变量设置之类的问题

!!!:但是,最大的可能是你找的mysqlbinlog版本过高!

解决方法:

一:降低mysqlbinlog版本(强烈推荐)

bash 复制代码
#选择更低版本的mysql容器:如 mysql:5.7.10,之前选择mysql:5.7.31,导致出现libatomic版本和后续的glibc问题
docker run -d --name=del_mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7.10
# 降低版本后,cp ,运行mysqlbinlog,完全无问题

二:安装libatomic(头铁是吧)

bash 复制代码
yum install libautomic


你有一定几率获取 新bug: 容器的glibc版本过低

bash 复制代码
sh-4.2# mysqlbinlog       
mysqlbinlog: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by mysqlbinlog)
mysqlbinlog: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by mysqlbinlog)
mysqlbinlog: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by mysqlbinlog)

此时你可以尝试以下2种方案:

  1. 包管理器更新glibc(推荐,但基本无效)
  2. 手动更新glibc(慎重,有惨烈案列,更新了,但是有一定几率再也启动不了容器)

包管理器更新glibc

bash 复制代码
yum update glibc
#查看更新后的glibc版本,第一次使用会下载点东西(60M左右)
yum info glibc

# 如果你发现版本没变,还是glibc 2.17,你可以再次挣扎下,更新yum的源缓存(基本无卵用),第一次使用会下载点东西(100M左右)
yum makecache

#再次更新,查看(基本可以恭喜你浪费了生命,喜提 2.17 版本信息),如果你升级到2.28以上,那么你没白费功夫
yum update glibc
yum info glibc | grep Version



手动更新glibc(头铁圣体)

请查看这篇文章,祝你好运,尝试解决Linux提示:/lib64/libc.so.6: version GLIBC_2.XX' not found
看之前先过眼下惨烈案列,慎重

相关推荐
战南诚13 分钟前
mysql的坑 - count计数
数据库·mysql
汪汪大队u15 分钟前
从 Docker Compose 到 Kubernetes:物联网管理系统迁移实战
物联网·容器·kubernetes
emiya_saber22 分钟前
docker cmd
linux·运维·docker
薪火铺子23 分钟前
MySQL 性能优化:慢查询与索引优化实战
数据库·mysql·性能优化
秋饼24 分钟前
kubernetes (K8S)组件介绍以及原理
云原生·容器·kubernetes
lpfasd12327 分钟前
Docker Compose删除服务后,docker compose down无法关闭的问题解决
docker·容器·eureka
u01196082329 分钟前
prefect resume pause
docker
小江的记录本36 分钟前
【MySQL】《MySQL基础架构 面试核心考点问答清单》
前端·数据库·后端·sql·mysql·adb·面试
会编程的土豆40 分钟前
MySQL 窗口函数详解
数据库·后端·mysql
小新同学^O^1 小时前
简单学习 --> Docker容器
学习·docker·容器