问题场景:
Mac本地跑的Mysql数据超过1000GB,然后需要把Docker当做MySQL启动的容器 , 把Mac当做宿主机器接入局域网让其他机器使用MySQL服务区(SSD的移动硬盘也有1000MB/S的读取和写入,不必Mac本地的硬盘读写速度差)。
安装Mac的Docker:
Docker Desktop for Mac and Windows | Docker
下载桌面版安装即可,傻瓜式操作。
Docker镜像仓库中下载MySQL:
点击:Docker的镜像仓库
# 下载最新版本的mysql镜像
~] docker pull mysql:latest
# 下载指定版本的mysql镜像
~] docker pull mysql:5.7
在SSD的移动硬盘创建文件夹:
直接可视化桌面邮件创建:
mysql/data
mysql/mysql-files
在Teminal终端中启动MySQL:
sudo docker run -p 3306:3306 --name 在Docker中的MySQL别名(比如:MyMySQL) -v /var/run/docker.sock:/var/run/docker.sock -v /etc/my.cnf:/etc/mysql/my.cnf -v /Volumes/移动硬盘的盘符名称/mysql/data:/var/lib/mysql -v /Volumes/移动硬盘的盘符名称/mysql/mysql-files:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=你的MySQL验证密码 -d --user 2034:50 mysql
解释:
参数说明
-p 3307:3306;将容器的3306端口映射到主机的3307端口 --name 把mysql容器命名 叫MyMySQL-v 目录挂载:
-v /Volumes/移动硬盘的盘符名称/mysql/data:/var/lib/mysql 将docker的实例数据源data文件夹挂载到主机
-v /Volumes/移动硬盘的盘符名称/mysql/mysql-files:/var/lib/mysql-files/ 将docker的mysql-files文件夹载到主机
-v /etc/my.cnf:/etc/mysql/my.cnf 将docker的配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root 初始化root用的密码
服务器重启后启动docker下的容器 docker container start mysql
MySQL 修改字符集utf8mb4:
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
修改 /etc/my.cnf文件内容
[client]
default-character-set=utf8mb4
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
default-storage-engine=INNODB
character-set-client-handshake = FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect=’SET NAMES utf8mb4’
重启MySQL容器
docker restart 镜像名jasghdjgasghjdasgjh
重新查看下MySQL字符集
mysql> show variables like 'character%';
MySQL 关闭 binlog
MySQL默认是开启了日志文件的,如果数据操作比较频繁就会产生大量的日志,在/usr/local/mysql /var/下面产生mysql-bin.0000* 类似的文件,而且一般都在几十MB到几个GB,更甚会吃掉整个硬盘空间。
如何关闭MySQL的日志功能:
修改/etc/my.cnf 文件,找到
log-bin=mysql-bin
binlog_format=mixed
再这两行前面加上#,将其注释掉。
#log-bin=mysql-bin
#binlog_format=mixed
重启MySQL容器
docker restart 镜像名jasghdjgasghjdasgjh
测试MySQL:
至此,安装一切正常的都可以在上图Navicat中测试链接成功。Mac成功把1000GB的数据转移到移动硬盘,缓解Mac的硬盘压力。
但是,如果能一帆风顺的话,也不会写出这篇文章。下面列出我遇到的问题和解决办法:
问题1:
使用此命令启动时,输出日志为:
chown: changing ownership of '/var/lib/mysql/': Operation not permitted
注意哈:是Operation not permitted,不是Permission denied,后者还容易解决。
很明显是/var/lib/mysql 这个文件夹不属于user的,是属于root,所以参考:
两篇文章的解决办法为 在docker命令行后面加上 --user 2034:50 然后mysql以user的权限启动即可
问题2:
Warning: World-writable config file ‘/etc/my.cnf’ is ignored
此语句虽然是Warning,但是影响已经比警告⚠️大!
看似MySQL实例起来了,其实没有加载/etc/my.cnf配置文件,如果不注意Warning信息,很容易留坑。
主要原因:MySQL出于安全的考虑,担心其他用户可以恶意修改my.cnf配置文件,所以忽略掉这个配置文件。
解决办法:
查看my.cnf的权限,
ls -l /etc/my.cnf
-rwxrwxrwx 1 root root 1404 Oct 16 19:31 /etc/my.cnf , 发现是777权限
chmod 644 /etc/my.cnf , 设置为644权限
docker container start mysql , 一切OK