概述:
在华为欧拉系统上采用Docker部署时,发现高版本Docker对MySQL5.7兼容性不佳(存在内存管理缺陷,即使调整配置参数仍会占用过高内存),故改用MySQL8.0。
服务器总内存为16GB,考虑到其他运行中的程序,暂为MySQL分配6GB内存,完全能满足中型项目需求。
Linux系统中MySQL配置文件通常位于/etc/my.cnf或/etc/mysql/my.cnf,若未找到可使用find命令搜索:
find /-name my.conf
安装具体步骤
一、docker安装mysql
1、docker拉取mysql8.0镜像 (前提是你已经安装docker,并配置好docker镜像源)
docker pull mysql:8.0
2、创建宿主机目录,用于存放mysql的日志、数据、配置文件,docker启动时指定好映射位置;
1)新建数据存放地址:
mkdir /data/mysql/data
chmod 755 /data/mysql/data
2)新建日志存放地址:
mkdir /data/mysql/logchmod 755 /data/mysql/log
3)新建配置文件
mkdir /data/mysql/config/my.cnfchmod 755 /data/myql/config/my.cnf
编辑配置文件内容(mysql5.7与mysql8.0配置文件在个别属性上是不一样的,这个也是在启动过程中,查看docker容器日志看到,不断修正)
[client]
# 端口号
port=3306[mysql]
no-beep
default-character-set=utf8mb4[mysqld]
# 端口号
port=3306
# 数据目录
datadir=/var/lib/mysql
# 新模式或表时将使用的默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 将 SQL 模式设置为严格
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
# 最大连接数
max_connections=500
# 表缓存
table_open_cache=2000
# 表内存
tmp_table_size=16M
# 线程缓存
thread_cache_size=32
# 设置大小写不敏感
lower_case_table_names=1
#临时处理Access denied for user 'root'@'localhost' (using password: YES)
#skip-grant-tables
performance_schema_max_table_instances=400
table_definition_cache=400
performance_schema = off
skip-host-cache
skip-name-resolve# innodb设置
innodb_flush_log_at_trx_commit = 2 # 平衡安全与性能
innodb_log_buffer_size = 16M # 大事务场景可增至32M
innodb_buffer_pool_size = 3G # 约内存的60%
innodb_log_file_size = 512M # 日志总大小约缓冲池的20%
innodb_log_files_in_group = 2 # 日志文件数量
innodb_thread_concurrency = 0 # 不限制并发
innodb_autoextend_increment = 1024 # 1GB增量,减少扩展次数
innodb_buffer_pool_instances = 8 # 缓冲池≥16G时设为8
innodb_concurrency_tickets = 10000 # 高并发场景增大
innodb_old_blocks_time = 1000 # 保持默认
innodb_open_files = 2000 # 增加打开文件数
innodb_stats_on_metadata = 0 # 禁止元数据更新统计
innodb_file_per_table = 1 # 启用独立表空间
innodb_checksum_algorithm = 0 # 保持默认# Binlog 功能
log_bin=mysql-bin # 开启 Binlog
server-id=12312
binlog_format=ROW # 使用 ROW 格式保证主从一致性
expire_logs_days=14 # 保留 14 天日志
max_binlog_size=512M # 单个日志最大 512MB
sync_binlog=1 # 事务提交即同步磁盘(强一致性)
log_slave_updates=1 # 从库记录 Binlog(支持级联复制)
binlog_ignore_db=information_schema,performance_schema,mysql # 忽略系统库
gtid_mode=ON # 启用 GTID
enforce_gtid_consistency=ON # 强制 GTID 一致性# 其他设置
back_log=80
flush_time=0
join_buffer_size=512K
max_allowed_packet=128M
max_connect_errors=300
open_files_limit=4096
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=64K
sync_master_info=5000
sync_relay_log=5000
sync_relay_log_info=5000
以上配置文件具体参数解释可以用豆包直接查询理解;
注意一旦配置文件确定好,后续产生的数据库数据,在mysql迁移的时候也要使用同样的配置文件,不然可能会报错;
3、执行docker启动命令,这里直接使用docker命令启动,熟练使用compose的可以直接进行编排;
1)新建docker执行脚本
vim /data/mysql/startMysql.sh
编辑内容:
docker run -d \
--privileged=true \
--name mysql \
--memory=6G \
--memory-swap=8g \
-p 3306:3306 \
--restart=always \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/config/my.cnf:/etc/mysql/my.cnf \
-v /data/mysql/log:/var/log/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123 mysql:8.0
注意:密码改为你自己的,如果需要主从库,可以新建docker网络,docker启动时指定网络,使用“–network mysqlnet”;
截止目前,你的宿主机的目录应该是这样的:
2)启动脚本
cd /data/mysql./startMysql.sh
3)查看mysql容器状态
docker ps docker logs mysql docker stats mysql
查看容器占用的内存:
docker stats --no-stream
符合我们预期;
4、配置mysql远程访问
1)进入容器内部:
docker exec -it --user=root mysql /bin/bash执行 mysql -uroot -p
注意:提示输入密码,不用输入,直接enter进入;
2)mysql8.0 与 mysql5.7 有所不同,mysql5.7使用:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123*';FLUSH PRIVILEGES;
mysql8.0需要新建一个用户,然后赋予权限:
-- 创建用户(密码需符合安全策略)
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'SecureP@ssw0rd';
-- 授予所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
所以我们要执行以上三行命令;
3)使用navicat等工具进行连接测试,当前应该是没有问题的;
附:如果想安装mysql5.7版本,可以参考
https://blog.csdn.net/u012263509/article/details/142323103?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-4-142323103-blog-141535096.235