“mysql docker容器密码更改后,其他关联容器无法启动” | “docker部分配置文件改错后,该容器无法启动” | “mysql into outfile报错,无法导出select数据” 等


···前言(相关问题集锦介绍)


  • 1.mysql/mariadb docker容器密码更改后,其他相关联docker容器无法正常start启动(即一直exit)
  • 2.mysql “into outfile”报错( [error] --secure-file-priv),无法正常导出select数据
  • 3.docker 部分配置文件改错后,该容器无法正常start启动(即一直exit)
  • 4.mysql改密码,改的时候一直报错/改完后完全不生效
  • 5.mysql子查询用法

问题1解决方法:复原链接时用的mysql密码

我的配置是MYSQL 容器和一个服务容器,这两个容器相关联,登录MYSQL的时候只能通过服务容器登录,MYSQL容器没有办法(mysql -u root -p)登录,所以在服务容器里面改完密码后系统重启,我的服务容器只要一start就会exit。

  • 解决的方法非常简单,先用commit打包一下目前服务容器作为新的镜像。
docker commit _yours_service_container_  _image_name_
  • 然后再使用Run对新镜像生成服务容器。
docker run -it --entrypoint /bin/bash _image_name_
  • 打开一个新终端,生成一个docker网络,并把MYSQL容器和新服务容器挂到一个网络上。
docker network create _net_name_
docker network connect _net_name_  _mysql_container_
docker network connect _net_name_  _new_service_container_
  • 查看一下MYSQL容器的ip。
docker inspect _mysql_container_ | grep 'IPAddress'
  • 然后回到新服务容器的bash界面,登录一下MYSQL,修改成原有的容器关联密码就可以了。
mysql -h _mysql_container_ip_ -u root -p
  • 改完把容器restart一下,容器就可以正常up正常工作了。

问题2解决方法:查看全局变量、修改配置文件

这种情况docker配置大概和我上面那个一样,一个mysql容器和一个/多个服务容器相关联,但是只能在服务容器中登录mysql。

  • 首先查看全局变量secure_file_priv。
show global variables like "secure%";

如果不为空,建议就into outfile到那个路径目录下(我个人建议你也别改。。。因为我也没试过,你非得想试的话,你可以先打一个快照然后按照我下面的试一试);如果为空,则需要修改一下配置文件。
虽然说是在服务容器上操纵MYSQL,但是相关配置文件需要在MYSQL容器中进行修改。

  • 进入到MYSQL容器后,进入到一个文件夹下。
docker exec -it _mysql_container_ /bin/bash
cd /etc/mysql/conf.d/

找my.cnf文件,可能这个目录下他就没有这个文件。我的mysql容器下就是这样子,网络上很多博客或帖子说要翻一下一些目录找到这个文件,但是也许就真的没有呢?也许你可以自己就可以创一个呢?对吧。
(当然你可能会在其他目录或其他路径下,确确实实找到同名的“my.cnf”这个文件,但你需要保证它里面的内容是以“[mysqld]”这个开头才可以!)

  • 我们直接创建一个my.cnf,然后你可以自己指定一个导出的文件夹。
touch my.cnf
echo "[mysqld]" >>my.cnf
echo "secure_file_priv = _you_desired_path_" >> my.cnf
  • 导出的文件夹权限一定要足,不然导出的时候还会因为权限问题报错,
    例如:Can’t create/write to file xxx (Errcode: 13 - Permission denied)
    一般没有什么特殊情况你直接设777就可以。
chmod 777 _you_desired_path_

普遍的docker容器中都是没有编辑器的,所以我们直接用touch创建文件和echo来进行文件的写。这种读写效率其实很低下,就仅仅适用于这种少量的配置文本。

  • 或者使用cp命令把已经写好的配置文件拷到docker内(在docker 外的终端执行)。
docker cp _host_file_path_  _dest_container_:_dest_container_file_path_
  • 然后outfile到你指定的文件夹即可。

问题3解决方法:查看历史记录,然后再把原有配置文件拷过去

  • 查看历史记录可以使用diff命令,这个命令主要是比较一下你在容器内主要修改过了哪些文件,它列出来会比较多,我建议是使用grep筛一下。
docker diff _yours_breakup_container_ | grep "_some_path_you_like"

一般修改配置文件无非就是/usr、/opt、/etc、/var之类的,如果你大概记得一点你修改过的文件名那你就用模糊grep(*)一下。

... | grep "_you_remember_*"
  • 可以把docker内一些东西拷过来:
docker cp _container_:_container_file_path_  _host_file_path_
  • or拷回去恢复一下:
docker cp _host_file_path_  _dest_container_:_dest_container_file_path_
  • 恢复完直接restart,一般容器就可以正常up了。

问题4解决方法:只是记忆数据库相关命令罢了~

一般要先看一下,不要直接上手改,不然可能会出现这样的报错:
ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost

用命令:

use mysql;
select user,host from user;

然后再按照输出的内容改就不会报错:
在这里插入图片描述

alter user 'root'@'%' identified by '_new_password_';

不推荐使用这个命令改密码,因为它对密码有要求:

set password for 'root'@'%' = password('_new_password_');

问题5:子查询相当于Linux的管道,好用

例如我的这条命令:

select submitid,output_compile 
	from judging 
	where result='compiler-error' && submitid in
		(select submitid 
			from submission 
			where cid=31 && langid='cpp') 
limit 10 
into outfile '/home/lzq/sqlfile.txt';

通过子查询,就可以达到类似于Linux下一个命令的数据通过管道传送到下一个命令作为参数。
需要经常导出数据的话,子查询要比写一个py代码来回调API数据方便的多。

6.just题外话

[博主题外话:也就是真正在工作应用中,大概让博主明白了一点“到底什么是Linux”、“到底什么是数据库”、“到底什么是docker”、“xxx到底有什么用”之类的问题哈哈哈,也算收获喽~]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值