安装MySQL

  1. 前提:安装docker服务并配置私有库,镜像加速地址
  2. 云服务器或者本地服务器开放MySQL端口3306
  3. 登录私有库,参考登录私有库步骤
  4. 拉取MySQL镜像
#拉取私有库MySQL镜像
docker pull 8.134.59.62:8083/mysql
●8.134.59.62:8083/mysql 为私有库镜像地址:私有库IP:端口号/镜像名
#查看已拉取下来的MySQL镜像
docker images
●该命令查看本地所有的镜像,可以用grep进行过滤

 

          5. 创建挂载目录及配置文件

#新建MySQL配置文件目录
mkdir -p /mnt/mysql/conf
●-p:所有不存在的上级目录会被自动创建

#添加配置文件my.cnf到目录/mnt/mysql/conf
#新建MySQL数据存放目录
mkdir -p /mnt/mysql/data
#新建MySQL日志目录
mkdir -p /mnt/mysql/log
#新建MySQL数据导入和导出目录
mkdir -p /mnt/mysql/mysql-files

 

           6. 授权目录

#对MySQL数据存放目录进行授权
chmod -R  755 /mnt/mysql/data
●-R:对目录及子目录或文件进行授权
#对MySQL日志目录进行授权
chmod -R  755 /mnt/mysql/log
#对MySQL数据导入和导出目录进行授权
chmod -R  755 /mnt/mysql/mysql-files
#对配置文件目录进行授权
chmod -R  755 /mnt/mysql/conf

说明:以下是MySQL通用的配置文件内容

#MySQL通用的配置文件内容
[mysqld]
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=1
#服务端口号 默认3306
port=3306
#mysql安装根目录(default /usr)
#basedir=/usr/local/mysql
#mysql数据文件所在位置
datadir=/mnt/mysql/data
#pid
pid-file=/mnt/mysql/data/mysqld.pid
#设置socke文件所在目录
socket=/mnt/mysql/data/mysql.sock
#设置临时目录
#tmpdir=/tmp
# 用户
user=mysql
# 允许访问的IP网段,全部网段
bind-address=0.0.0.0
# 跳过密码登录
#skip-grant-tables
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容
#skip-external-locking
#只能用IP地址检查客户端的登录,不用主机名
#skip_name_resolve=1
skip-name-resolve
#事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
#transaction_isolation=READ-COMMITTED
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server=utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server=utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names=1
#最大连接数
max_connections=400
#最大错误连接数
max_connect_errors=1000
#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp=true
#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet=128M
#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout=1800
wait_timeout=1800
#内部内存临时表的最大值 ,设置成128M。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size=134217728
max_heap_table_size=134217728
#禁用mysql的缓存查询结果集功能
#后期根据业务情况测试决定是否开启
#大部分情况下关闭下面两项
#query_cache_size = 0
#query_cache_type = 0
#数据库错误日志文件
#log-error=/var/log/mysqld.log
#慢查询sql日志设置
#slow_query_log=1
#slow_query_log_file=/var/log/mysqld_slow.log
#检查未使用到索引的sql
log_queries_not_using_indexes=1
#针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
log_throttle_queries_not_using_indexes=5
#作为从库时生效,从库复制中如何有慢sql也将被记录
log_slow_slave_statements=1
#慢查询执行的秒数,必须达到此值可被记录
long_query_time=8
#检索的行数必须达到此值才可被记为慢查询
min_examined_row_limit=100
#mysql binlog日志文件保存的过期时间,过期后自动删除
#expire_logs_days=5
binlog_expire_logs_seconds=604800

#若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数
default_time_zone = "+8:00"

 

           7. 创建容器

docker run -p 3306:3306 --name mysql --restart=always --privileged=true -v /mnt/mysql/log:/var/log/mysql -v /mnt/mysql/data:/var/lib/mysql -v /mnt/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /mnt/mysql/mysql-files:/var/lib/mysql-files -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=123456 -d  8.134.59.62:8083/mysql
●docker run: 运行一个新的容器
●-p 3306:3306:第一个是宿主机端口,第二个是容器端口,将容器的 3306 端口映射到宿主机的 3306 端口
●--name mysql: 为容器指定名称为 mysql
●--restart=always: 容器随docker服务自动启动
●--privileged=true:获取宿主机root权限
●-v /mnt/mysql/log:/var/log/mysql: 第一个是宿主机目录,第二个是容器目录,将宿主机的日志目录挂载到容器的 /var/log/mysql 目录
●-v /mnt/mysql/data:/var/lib/mysql: 第一个是宿主机目录,第二个是容器目录,将宿主机的数据存放目录挂载到容器的数据目录
●-v /mnt/mysql/conf/my.cnf:/etc/mysql/my.cnf: 第一个是宿主机的mysql配置文件,第二个是容器的配置文件,将宿主机的配置文件挂载到容器
●-v /mnt/mysql/mysql-files:/var/lib/mysql-files: 将宿主机的数据导入目录挂载到容器数据导入目录
●-v /etc/localtime:/etc/localtime:ro: 挂载宿主机的本地时间到容器,保持时间同步,设置为只读(ro)
●e MYSQL_ROOT_PASSWORD=123456: 设置 MySQL root 用户的密码为 123456-d: 后台运行容器
●8.134.59.62:8083/mysql:镜像名称,这个是从私有仓库中拉取下来的镜像

 

          8. 检验MySQL是否安装成功

#查看MySQL容器是否启动成功
docker ps
#查看MySQL容器启动日志是否有报错
docker logs  mysql
#查看MySQL端口号是否在启用状态
netstat -nlpt |grep 3306
#navicat远程登陆

 

            9. 常见问题处理

           a. MySQL安装后,navicat远程登陆不了,原因是端口号没有开放

#查看发现远程访问MySQL端口号不通
telnet ip:端口号
解决方法:云服务器安全组开放端口,本地防火墙添加端口例外

 

             b.修改挂载映射的配置文件端口号,其实是修改容器的端口,而不是宿主机端口号

             c. 修改MySQL的宿主机访问端口号,在创建容器时设置所需的宿主机端口即可

             d.进入MySQL容器后,使用mysql -u root -p登陆失败

查看容器日志报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
#解决方法:由于MySQL容器不会使用本地套接字来连接,而是通过网络端口进行连接因此可使用IP进行登陆
mysql -h 127.0.0.1 -P 3306 -u root -p

 

查看容器日志报错:Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
客户端连接登录报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
#解决方法:MySQL跳过密码登陆,连续按两下Enter键即可免密登录
docker exec -it mysql /bin/bash
mysql -u root -p
连续按两下Enter键免密登录

               e. 客户端远程连接,root用户没有远程登录权限:“ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server”

#解决方法:登陆MySQL本地,为root用户开启远程登陆权限

#a.进入容器
docker  exec  -it  mysql   /bin/bash
#b.登陆MySQL本地
mysql -u  root  -p  
输入root用户密码登录本地
#c.进入mysql库,查看root用户是否有远程权限
use  mysql;
select   host  from  user  where  user='root';
结果显示host栏对应的是localhost,那证明root用户没有远程登陆权限
#d.授予root用户远程登录权限,并刷新权限
update  user  set  host='%'  where  user='root';
FLUSH PRIVILEGES;
#e.检查授予root用户远程登录权限是否成功
select   host  from  user  where  user='root';
结果显示host栏对应的是%,证明授权成功

说明:如下是授予root用户远程登录权限的截图过程

 

                 f.MySQL修改密码

#进入mysql容器
docker exec -it 容器名 /bin/bash
#本地登录MySQL或者用navicat远程连接登陆
mysql -u root -p
#修改用户密码
ALTER USER 'root'@'%' IDENTIFIED BY '新密码';
#刷新权限
FLUSH PRIVILEGES;

 

posted @ 2024-11-19 15:38  羊孩  阅读(14)  评论(0编辑  收藏  举报
返回顶端