···前言(相关问题集锦介绍)
- 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到底有什么用”之类的问题哈哈哈,也算收获喽~]