centos7下mysql8 主从安装配置

centos7下mysql8 主从安装配置

centos7 版本下载

镜像版本要求centos7的小版本;下载地址建议从阿里云镜像站下载地址 image.png 目前官方镜像分为如下类型:

  • CentOS-7-x86_64-DVD-2009.iso       标准安装版,一bai般下载这个就可以了。
  • CentOS-7-x86_64-NetInstall-2009.iso  网络安装镜像du。
  • CentOS-7-x86_64-Everything-2009.iso 对完整版安装盘的软件进行补充集成所有软
  • CentOS-7-x86_64-Minimal-2009.iso 精简版本,包含核心组件。

这边我使用CentOS-7-x86_64-DVD-2009.iso 安装centos7操作系统

image.png

mysql 8.0.20下载

mysql版本要求 mysql8.0.20;下载地址建议从官方镜像站下载地址:mysql8.0.20

mysql8.0.20 二进制安装

总体安装步骤概述如下:

  1. 操作系统等相关配置设置
  2. 安装依赖包
  3. 创建用户
  4. 修改配置文件、创建相关数据目录、日志目录等并授权
  5. 运行安装命令,启动数据库
  6. 配置环境变量、服务等(看需要)

操作系统配置和设置

查看CPU、内存、SSL版本、硬盘大小、关闭防火墙和selinux

查看物理CPU个数

[root@localhost ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1
复制代码

查看逻辑CPU的个数

[root@localhost ~]# cat /proc/cpuinfo| grep "processor"| wc -l
1
复制代码

查看CPU信息(型号)

[root@localhost ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
      1  Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
复制代码

查看内存:

[root@localhost ~]# cat /proc/meminfo
MemTotal:        1863076 kB
MemFree:           81492 kB
MemAvailable:      48092 kB
......
复制代码

查看ssl版本

[root@localhost ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
复制代码

查看硬盘大小 尽量将/根目录占用所有磁盘目录的80% ;home目录50-100g即可

[root@localhost ~]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.6M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  5.4G   12G  32% /
/dev/sda1               1014M  150M  865M  15% /boot
tmpfs                    182M     0  182M   0% /run/user/0
复制代码

关闭防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service
复制代码

修改selinux,将SELINUX=enforcing 改为SELINUX=disabled

[root@localhost ~]# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
复制代码
# 不重启机器生效
setenforce 0
复制代码

修改文件限制等

[root@localhost ~]# vi /etc/security/limits.conf
hard nofile 65535
soft nofile 65535
ulimit -n 65535
复制代码
[root@localhost ~]# vi /etc/sysctl.conf

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

fs.aio-max-nr = 1048576
fs.file-max = 6553600
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000


# 生效
sysctl – p

复制代码

安装mysql组件包

yum install -y epel-release wget
yum install -y glibc gcc gcc-c++ openssl-devel autoconf automake cmake bison make ncurses-devel numactl numactl-devel
yum install -y libtool-ltdl-devel** zlib* libxml* fiex**
yum install -y libaio libaio-devel libmcrypt libmcrypt-devel mcrypt mhash**
复制代码

创建用户和用户文件夹

groupadd mysql
useradd -r -g mysql mysql
复制代码

将下载好的安装包上传到服务器执行目录,也可以直接用wget下载软件包

https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz**](https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
复制代码
# 解压
tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
# 移动到/user/local 目录
mv mysql-8.0.20-linux-glibc2.12-x86_64 /usr/local/mysql
# 添加环境变量
cat >>/etc/profile << EOF
export PATH=$PATH:/usr/local/mysql/bin
EOF
# 环境变量生效
source /etc/profile
# 创建mysql安装所需文件夹
mkdir -p /data/mysql/tmp
mkdir -p /data/mysql/data
mkdir -p /data/mysql/etc
mkdir -p /data/mysql/logs
# 授予文件夹mysql权限
chown -R mysql:mysql /data/mysql
复制代码

修改配置文件

[mysqld]
########basic settings########
server-id = 112             #建议和服务器ip保持一致 例如192.168.1.66  则此处写66
port = 3306
user = mysql
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /data/mysql/data      #根据实际情况修改,建议和程序分离存放
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 512M
tmp_table_size = 512M
tmpdir = /data/mysql/tmp
pid-file = /data/mysql/tmp/mysqld.pi
socket = /tmp/mysql.sock
max_allowed_packet = 1024M
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16M
read_rnd_buffer_size = 32M
sort_buffer_size = 32M
lower_case_table_names=1      #大小写不敏感,linux专属 window服务器直接注释掉
default_time_zone='+8:00'
########log settings########
log_error =/data/mysql/logs/mysqld.log            #根据实际情况修改建议和datadir 位于不同物理磁盘
slow_query_log = 1
slow_query_log_file = /data/mysql/logs/slow.log   #根据实际情况修改建议和datadir 位于不同物理磁盘
#log_queries_not_using_indexes = 1 #调试数据库的时候打开,此选项将记录所有没走索引的sql语句,不管执行快慢
log_slow_admin_statements = 1
log_slow_slave_statements = 1
#log_throttle_queries_not_using_indexes = 10  #设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间
binlog_expire_logs_seconds=10800                 #如果log_bin 所在磁盘空间充足;建议调整至25200
long_query_time = 2
min_examined_row_limit = 100


########replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = /data/mysql/logs/mysql_binlog   #根据实际情况修改建议和datadir 位于不同物理磁盘
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log = /data/mysql/logs/relay.log    #根据实际情况修改建议和datadir 位于不同物理磁盘
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors

########innodb settings########
innodb_page_size = 16384  #兼容老系统
innodb_buffer_pool_size = 14G    #根据实际情况修改 一般为服务器可用内存的80%
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_log_group_home_dir = /data/mysql/logs/   #根据实际情况修改建议和datadir 位于不同物理磁盘
innodb_flush_neighbors = 1
innodb_log_file_size = 512M               #根据实际情况修改
innodb_log_buffer_size = 16777216
innodb_purge_threads = 4
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864
innodb_read_io_threads=24                #服务器cpu逻辑核数的60% 取整数 例如你是32核 建议调整到19
innodb_write_io_threads=24               #服务器cpu逻辑核数的60% 取整数 例如你是32核 建议调整到19

########semi sync replication settings########
plugin_dir=/usr/local/mysql/lib/plugin      #根据实际情况修改
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
[mysqld-8.0]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
default_authentication_plugin = 'mysql_native_password'
log_bin_trust_function_creators=1
复制代码

安装和启动数据库

指定本实例的配置文件进行安装

建议写全路径运行命令进行安装

/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
复制代码

查看日志

vi /data/mysql/logs/mysqld.log
复制代码

此时可以看到临时密码,并查看是否有错误产生:A temporary password is generated for root@localhost: 密码

[root@localhost ~]# vi /data/mysql/logs/mysqld.log

2021-11-22T11:36:07.179120+08:00 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.20) initializing of server in progress as process 2503
2021-11-22T11:36:07.216846+08:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-11-22T11:36:11.364494+08:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-11-22T11:36:11.697981+08:00 0 [Warning] [MY-013501] [Server] Ignoring --plugin-load[_add] list as the server is running with --initialize(-insecure).
2021-11-22T11:36:12.605450+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: VZico+qE8l0M
复制代码

启动数据库

  • 方法1:以服务模式启动数据库 建议用此方式启动。
cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
service mysqld start
复制代码
  • 启动数据库,并在后台运行(执行下面命令时多次回车,专为小白而备注)
/usr/local/mysql/bin/mysqld_safe  --defaults-file=/etc/my.cnf &
复制代码

查看数据库进程

[root@localhost ~]# ps -ef | grep mysql
root       1901      1  0 15:59 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/tmp/mysqld.pi
mysql      2800   1901  1 15:59 pts/0    00:00:56 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/logs/mysqld.log --pid-file=/data/mysql/tmp/mysqld.pi --socket=/tmp/mysql.sock --port=3306
root       5569   1816  0 16:54 pts/0    00:00:00 grep --color=auto mysql
复制代码

修改mysql默认密码

登录数据库修改root密码。安装按成必须修改随机root密码,不然无法操作其他内容

[root@localhost ~]#/usr/local/mysql/bin/mysql -u root -p '初始生成密码' -S /tmp/mysql.sock
mysql> ALTER USER 'root'@'%' IDENTIFIED BY '要修改的密码';
复制代码

mysql8主从配置

  1. 将上面安装好mysql的虚拟复制1台(注意修改ip)
  2. 修改master和slave my.cnf文件
#建议和服务器ip保持一致,防止重复
server-id = 112       
复制代码
  1. 重命名auto.cnf文件(auto.cnf默认在mysql的data目录下)
mv /data/mysql/data/auto.cnf /data/mysql/data/auto.cnf_bak
复制代码
  1. 重启master服务
service mysqld restart
复制代码
  1. 为从节点创建一个登陆用户 repl
[root@localhost ~]# mysql -u root -p
[这里输入mysql链接密码]
mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Ron_master_1';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.00 sec)
复制代码

这里注意'repl'@'%'中 % 不要写ip

  1. 查看master节点状态
[root@localhost ~]# mysql -u root -p
[这里输入mysql链接密码]
mysql> show master status;
+---------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                   |
+---------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+
| mysql_binlog.000010 |     1304 |              |                  | 56b7da5a-4b45-11ec-ae40-000c2964986e:1-14,
fef0443e-4b5d-11ec-bf78-000c2964986e:1-5 |
+---------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

复制代码

这里要注意 File 和 Position 后面要用。

  1. 登陆slave服务,配置主节点信息
[root@localhost ~]# mysql -u root -p
[这里输入mysql链接密码]
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.182.110',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='Ron_master_1',
    -> MASTER_LOG_FILE='mysql_binlog',
    -> MASTER_LOG_POS=856;
复制代码

注意:

CHANGE MASTER TO
# master 节点ip
MASTER_HOST='192.168.182.110,
# master节点登陆用户
MASTER_USER='repl',
# master节点登陆用户密码
MASTER_PASSWORD='Ron_master_1',
# binlog日志文件 对应上一步中的File
MASTER_LOG_FILE='mysql_binlog',
# 对应上一步Position
MASTER_LOG_POS=856;
复制代码
  1. 检查slave节点状态
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.182.110
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_binlog.000010
          Read_Master_Log_Pos: 196
               Relay_Log_File: relay.000002
                Relay_Log_Pos: 327
        Relay_Master_Log_File: mysql_binlog.000010
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table:
复制代码

Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes Slave_SQL_Running: Yes 看到这些说明我们配置成功了,接下来可以使用nacicat等连接工具测试一下。

记录

  1. mysql查看当前用户列表
SELECT User, Host FROM mysql.user;
复制代码

常见问题

  1. Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

image.png 这个错误提示。即主从架构中使用了相同的UUID。首先排查server_id系统变量,是否相同:

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 110   |
+---------------+-------+
1 row in set (0.00 sec)
复制代码
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 111   |
+---------------+-------+
1 row in set (0.00 sec)
复制代码

发现我们已经改为两个不同的了,查看auto.cnf文件(找不到可以使用find / -name auto.cnf查找)

[root@localhost logs]# vim /data/mysql/data/auto.cnf

[auto]
server-uuid=56b7da5a-4b45-11ec-ae40-000c2964986e

复制代码
[root@localhost logs]# vim /data/mysql/data/auto.cnf

[auto]
server-uuid=56b7da5a-4b45-11ec-ae40-000c2964986e

复制代码

可以看出两个计器上的server-uuid出现了重复,原因是克隆了虚拟机,只改server_id不行。

解决:重命名master auto.cnf文件后重启mysql

[root@localhost ~]# mv /data/mysql/data/auto.cnf /data/mysql/data/auto.cnf.bak
[root@localhost ~]# service mysqld restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL.... SUCCESS! 
[root@localhost ~]# vim /data/mysql/data/auto.cnf 

[auto]
server-uuid=fef0443e-4b5d-11ec-bf78-000c2964986e
复制代码

重启后可以看出server-uuid已经重新生成了。

  1. 主从同步报错 Got fatal error 1236 from master when reading data from binary log: 'Could not find first log...

这个是因为binlog位置索引处的问题,解决方法:

1.打开主服务器,进入mysql
2.执行flush logs;# 这时主服务器会重新创建一个binlog文件;
3.在主服务上执行show master slave \G; # 记录 a 和 Position
4.来到从服务器的mysql;
5.stop slave;
6.change master to master_log_file='File',master_log_pos=Position; #这里的file和pos都是上面主服务器master显示的。
7.start slave;
8.show slave status \G; # 查看从表状态
复制代码

猜你喜欢

转载自juejin.im/post/7033323078507560997