docker 安装 mysql

安装单机 mysql

拉取镜像

docker pull mysql:8.0.39

创建mysql数据和配置目录

mkdir -p /data/mysql/log
mkdir -p /data/mysql/data
mkdir -p /data/mysql/share
mkdir -p /data/mysql/conf.d

创建配置文件my.cnf

vim /data/mysql/conf.d/my.cnf
[client]
port=3306
[mysqld]
character-set-server=utf8mb4
port=3306
max_connections=200
default-storage-engine=INNODB
innodb_buffer_pool_size=128M

创建容器

docker run -d -p 3306:3306 --name mysql --privileged=true -v /data/mysql/conf.d:/etc/mysql/conf.d -v /data/mysql/log:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root mysql:8.0.39

创建完成查询容器列表

如果要配置远程连接的话,需要开放端口3306,如果是云服务器,需要开两次:

  • linux服务器防火墙

    # 开放3306端口
    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    # 加载规则
    firewall-cmd --reload
    # 查询端口开启情况
    firewall-cmd --zone=public --query-port=3306/tcp
    
  • 云服务器厂商防火墙,基本上都是在云服务器监控菜单中。

还需要查询当前mysql的对于root用户配置的连接权限

# 进入mysql容器
docker exec -it mysql bash
# 输入mysql连接命令
mysql -uroot -p
# 输入密码
# 使用mysql库
use mysql;
# 查询root用户连接权限,默认应该是 localhost 只支持本地连接
select host,user from user;

我这边是配置完成的,%代表支持所有ip访问。

改变root用户连接权限

alter user 'root'@'localhost' identified by 'root';
update user set host = "%" where user = 'root';
flush privileges;

补上成功样例:

2278947-20240903230601432-2018686127

主从搭建

基本配置:同一台宿主机下搭建mysql一主一从

  • 主机对应宿主机目录 :/data/mysql/master/,从机对应宿主机目录:/data/mysql/slave/
  • 主机端口:3307,从机端口:3308
  • 主机 server-id=101,从机 server-id=102(同一局域网下 server-id 必须唯一)

设置主机

  1. 设置主机配置文件

    mkdir -p /data/mysql/master/log
    mkdir -p /data/mysql/master/data
    mkdir -p /data/mysql/master/share
    mkdir -p /data/mysql/master/conf.d
    vim /data/mysql/master/conf.d/my.cnf
    
    [client]
    port=3306
    [mysql]
    no-beep
    [mysqld]
    port=3306
    # 设置server-id 同一局域网内需要唯一
    server-id=101
    # 字符集
    character-set-server=utf8mb4
    # 默认使用存储引擎类型
    default-storage-engine=INNODB
    # 慢查询日志
    slow-query-log=1
    # 慢查询阈值 达到阈值才会记录 单位:s
    long_query_time=10
    # binlog 日志存放位置
    log-bin=master_binlog
    # 指定不需要同步的数据库名称
    binlog-ignore-db=mysql
    # 设置binlog文件使用的内存大小
    binlog_cache_size=1M
    # binlog_format=row 设置binlog刷盘策略 新版已被废弃,默认为 row
    # binlog 过期清理时间 默认为30天
    binlog_expire_logs_seconds=604800
    # 跳过主从复制中遇到的所有错误或指定类型的错误 避免 slave 主从同步失败
    # 1062:主键重复 1032:主从数据不一致
    replica_skip_errors=1062
    # 最大连接数量
    max_connections=151
    # 存储引擎内存大小
    innodb_buffer_pool_size=128M
    # 最大连接错误数量
    max_connect_errors=100
    
  2. 创建并启动 mysql-master 容器

    docker run -d -p 3307:3306 --name mysql-master --privileged=true -v /data/mysql/master/conf.d:/etc/mysql/conf.d -v /data/mysql/master/log:/var/log/mysql -v /data/mysql/master/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root mysql:8.0.39
    
  3. 进入容器,并设置主从同步用户

    docker exec -it mysql-master bash
    
    # 创建主从同步用户
    # 创建 slave 用户可以通过 root 密码登录当前机器
    mysql> create user 'slave'@'%' identified by 'root';
    Query OK, 0 rows affected (0.01 sec)
    
    # 赋予 slave 用户复制权限:Replication client、Replication slave
    mysql> grant replication slave,replication client on *.* to 'slave'@'%';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    

    replication client:权限代表允许执行show master status,show slave status,show binary logs命令

    replication slave:权限代表允许slave从机通过此用户进行主从复制

设置从机

  1. 设置主机配置文件

    mkdir -p /data/mysql/slave/log
    mkdir -p /data/mysql/slave/data
    mkdir -p /data/mysql/slave/share
    mkdir -p /data/mysql/slave/conf.d
    vim /data/mysql/slave/conf.d/my.cnf
    
    [client]
    port=3306
    [mysql]
    no-beep
    [mysqld]
    port=3306
    # 设置server-id,同一局域网内需要唯一
    server-id=102
    # 字符集
    character-set-server=utf8mb4
    # 默认使用存储引擎类型
    default-storage-engine=INNODB
    # 慢查询日志
    slow-query-log=1
    # 慢查询阈值,达到阈值才会记录,单位:s
    long_query_time=10
    # binlog 日志存放位置
    log-bin=slave_binlog
    # 指定不需要同步的数据库名称
    binlog-ignore-db=mysql
    # 设置binlog文件使用的内存大小
    binlog_cache_size=1M
    # binlog_format=row 设置binlog刷盘策略 新版已被废弃,默认为 row
    # binlog 过期清理时间 默认为30天
    binlog_expire_logs_seconds=604800
    # 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 主从同步失败
    # 1062:主键重复;1032:主从数据不一致
    replica_skip_errors=1062
    # 设置server-id,同一局域网内需要唯一
    # 设置从机中继日志存放位置
    relay_log=relay_log
    # 表示从机将主机的 binlog 写入自己 binlog 中
    log_slave_updates
    # 最大连接数量
    max_connections=151
    # 存储引擎内存大小
    innodb_buffer_pool_size=128M
    # 最大连接错误数量
    max_connect_errors=100
    

    log_slave_updates=1:如果不配置,从库从主库复制的数据不会写入log-bin日志文件里;假如从机宕机重启后,就会造成数据丢失。

  2. 创建并启动 mysql-master 容器

    docker run -d -p 3308:3306 --name mysql-slave --privileged=true -v /data/mysql/slave/conf.d:/etc/mysql/conf.d -v /data/mysql/slave/log:/var/log/mysql -v /data/mysql/slave/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root mysql:8.0.39
    
  3. 查询主机状态

    mysql> show master status;
    +----------------------+----------+--------------+------------------+-------------------+
    | File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +----------------------+----------+--------------+------------------+-------------------+
    | master_binlog.000003 |      878 |              | mysql            |                   |
    +----------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  4. 进入容器,并配置主从复制

    docker exec -it mysql-slave bash
    
    # 创建主从同步用户
    # 创建 slave 用户可以通过 root 密码登录当前机器
    mysql> change master to master_host='宿主机ip',master_user='slave',master_password='root',master_port=3307,master_log_file='master_binlog.000003',master_log_pos=878,master_connect_retry=30;
    Query OK, 0 rows affected, 10 warnings (0.03 sec)
    
    # 查询主从同步状态
    mysql> show slave status \G;
    
    # 开启主从同步
    mysql> start slave;
    Query OK, 0 rows affected, 1 warning (0.03 sec)
    

    master_port:主机暴露的端口,注意:如果主从不在一台机器,要将对应端口暴露出来。

    master_log_file:主机中要同步的binlog文件名

    master_log_pos:当前主机中 binlog 的数据大小

    master_connect_retry:连接失败重试时间间隔

主从连接问题

This was attempt 1/86400, with a delay of 30 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

问题描述:密码认证失败

原因:mysql 高版本的密码都是用 caching_sha2_password 加密过的,从机使用明文进行连接不会成功。

解决:

  1. 主机创建用户时,不要对密码进行加密处理,以下操作是在主机中:

    mysql> create user 'slave'@'%' identified with 'mysql_native_password' by 'root';
    
  2. 使用对应的主从同步用户获取主机中的公钥,下列操作均在从机中:

    • (推荐)get_master_public_key=1

      mysql> change master to master_host='宿主机ip',master_user='slave',master_password='root',master_port=3307,master_log_file='master_binlog.000003',master_log_pos=878,master_connect_retry=30,get_master_public_key=1;
      
    • --server-public-key-path=/xxx/xxx/public_key.pem:获取主机中的公钥并保存在对应目录下

      mysql> mysql -u slave -proot -h 宿主机ip -P3307 --server-public-key-path=/xxx/xxx/public_key.pem;
      
      mysql> change master to master_host='宿主机ip',master_user='slave',master_password='root',master_port=3307,master_log_file='master_binlog.000003',master_log_pos=878,master_connect_retry=30;
      

参考:https://www.modb.pro/db/29919

posted @ 2024-09-01 15:39  plum_wink  阅读(80)  评论(0编辑  收藏  举报