一、需求背景
因机房频繁断电,采用传统MySQL数据库部署方式崩溃俩次,导致数据丢失,更换俩台服务器均出现此情况,故考虑更换MySQL部署方式。
二、Docker运行MySQL
1、版本信息
[root@MySQL-WQ conf]# docker -vDocker version 19.03.12, build 48a66213fe
2、拉取镜像: docker pull mysql:5.7.34
报错:
root@MySQL-WQ ~]# docker pull mysql:5.7.34Error response from daemon:Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:56229->[::1]:53: read: connection refused
解决:添加国内镜像源即可
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、创建挂载目录并运行容器
# 宿主机创建数据存放目录映射到容器mkdir -p usr/local/docker_data/mysql/data# 宿主机创建配置文件目录映射到容器mkdir -p usr/local/docker_data/mysql/conf #(需要在此目录下创建"conf.d"、"mysql.conf.d"两个目录)mkdir -p usr/local/docker_data/mysql/conf/conf.d # (建议在此目录创建my.cnf文件并进行相关MySQL配置)mkdir -p usr/local/docker_data/mysql/conf/mysql.conf.d# 宿主机创建日志目录映射到容器mkdir -p usr/local/docker_data/mysql/logs# CentOS 7 不建议用这个命令docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d -v usr/local/docker_data/mysql/data:/var/lib/mysql -v usr/local/docker_data/mysql/conf:/etc/mysql/ -v usr/local/docker_data/mysql/logs:/var/log/mysql mysql:5.7# 经测试上面这行命令在 CentOS 7 下目录挂载失败。# 在上面这行命令的基础上增加了--privileged=true参数,让容器拥有真正的root权限docker run --privileged=true --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d -v /usr/local/docker_data/mysql/data:/var/lib/mysql -v /usr/local/docker_data/mysql/conf:/etc/mysql/ -v /usr/local/docker_data/mysql/logs:/var/log/mysql mysql:5.7
此时使用docker ps看到容器正常运行,即创建成功。

三、配置MySQL
1、配置数据库账号远程访问
docker exec -it mysql5.7 bashmysql -u root -p# 创建用户并开启远程登录CREATE USER '你的账号'@'%' IDENTIFIED BY '你的密码';# 创建数据库并设置字符集CREATE DATABASE `库名` CHARACTER SET 'utf8mb4';# 给账号授权数据库GRANT ALL PRIVILEGES ON `库名`.* TO '你的账号'@'%';# 刷新权限FLUSH PRIVILEGES;
配置完成后,用客户端连接报错Access denied:
[root@MySQL-WQ ~]# mysql -uroot -P13306 -p --socket=/usr/local/Yinling/mysql/mysql.sockEnter password:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
解决:加入--protocol参数
mysql -uroot -P13306 -p --host=127.0.0.1 --protocol=TCP
成功连接命令如下:mysql -uroot -h10.18.x.x -P13306 -pyl123456 --socket=/usr/local/Yinling/mysql/mysql.sock --protocol=TCP
同时,也可使用Navicat进行连接测试。
防火墙规则放行:(如果开启了防火墙,该数据库应该设置允许被访问,命令如下)
查看防火墙状态,并列出防火墙条目:systemctl status firewalldfirewall-cmd --list-all
firewall-cmd --zone=public --add-port=13306/tcp --permanentfirewall-cmd --zone=public --add-source=192.168.207.22 --permanentfirewall-cmd --reload
2、调整数据库配置文件
配置文件路径: /usr/local/docker_data/mysql/conf
配置文件内容如下:
[mysqld]server_id = 1port = 3306character-set-server = utf8collation-server = utf8_general_cisql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZEROlower_case_table_names = 1#lower_case_file_system = 1transaction-isolation = READ-COMMITTEDdefault-time_zone = '+8:00'log_timestamps = SYSTEMlog_bin=mysql-binexpire_logs_days=30binlog_format=ROW###############################innodb_buffer_pool_size = 8Ginnodb_log_file_size=128Minnodb_log_files_in_group=4innodb_log_buffer_size=16Minnodb_write_io_threads = 8innodb_read_io_threads = 8innodb_max_dirty_pages_pct = 90innodb_lock_wait_timeout = 120innodb-file-per-table=1auto_increment_increment=1auto_increment_offset=1connect_timeout=10group_concat_max_len=1024innodb_thread_concurrency=0innodb_thread_sleep_delay=10000innodb_write_io_threads=12interactive_timeout=28800lock_wait_timeout=31536000long_query_time=10.000000low_priority_updates=OFFmax_allowed_packet=500Mmax_connect_errors=999999999max_connections=1600max_length_for_sort_data=1024max_prepared_stmt_count=16382max_user_connections=0net_read_timeout=30net_retry_count=10net_write_timeout=60ngram_token_size=2open_files_limit=102400performance_schema=OFFquery_alloc_block_size=8192query_cache_limit=1048576query_cache_size=1024Mquery_cache_type=OFFquery_cache_wlock_invalidate=OFFquery_prealloc_size=8192slow_launch_time=2table_definition_cache=768table_open_cache=512table_open_cache_instances=16thread_cache_size=512tmp_table_size=1073741824wait_timeout=2147483interactive_timeout=3153600explicit_defaults_for_timestamp = truelog-bin-trust-function-creators = 1
常见配置:
1、设置数据库不区分大小写,避免报错情况产生。
参数:lower_case_table_names = 1 #1表示不区分大小写,0表示区分大小写
验证:show variables like '%case%';
mysql> show variables like '%case%';+------------------------+-------+| Variable_name | Value |+------------------------+-------+| lower_case_file_system | OFF || lower_case_table_names | 1 |+------------------------+-------+2 rows in set (0.00 sec)
2、开启binlog日志
配置参数:
log_bin=mysql-binexpire_logs_days=30binlog_format=ROW
验证:show variables like '%log_bin%';
mysql> show variables like '%log_bin%';+---------------------------------+--------------------------------+| Variable_name | Value |+---------------------------------+--------------------------------+| log_bin | ON || log_bin_basename | /var/lib/mysql/mysql-bin || log_bin_index | /var/lib/mysql/mysql-bin.index || log_bin_trust_function_creators | ON || log_bin_use_v1_row_events | OFF || sql_log_bin | ON |+---------------------------------+--------------------------------+6 rows in set (0.00 sec)
修改完毕后,执行重启,即可生效。
docker restart mysql5.7

文章转载自巴韭特锁螺丝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




