前言
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
mysql官网
1、安装mysql5.7
1.1 安装前环境准备
环境:rhel7.6 gcc(安装mysql8需要5.3版本以上) cmake升级(3.5版本以上)
[root@server1 ~]# yum install gcc gcc-c++ -y #安装之前确保c与c++编译都有,不然configure报错
[root@server1 ~]# tar zxf cmake-3.20.2.tar.gz
[root@server1 ~]# cd cmake-3.20.2
[root@server1 ~]# ./configure
[root@server1 ~]# make
[root@server1 ~]# make install
[root@server1 cmake-3.20.2]# which cmake
/usr/local/bin/cmake
1.2 编译mysql-5.7.31
到mysql官网下载对应版本
mysql5.7安装:
[root@server1]# tar zxf mysql-boost-5.7.31.tar.gz
[root@server1]# cd mysql-5.7.31
[root@server1 mysql-5.7.31]# mkdir build
##新建build目录的目的是将所有的构建信息放在这个目录里,cmake完了可以删掉
[root@server1 mysql-5.7.31]# cd build
[root@server1 build]# cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定安装路径
-DMYSQL_DATADIR=/data/mysql \ #指定数据存放点
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DSYSCONFDIR=/etc \ #配置文件路径
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \ #字符集
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0
[root@server1 build]# make -j2 #使用双核cpu编译,速度更快,内存至少4G
[root@server1 build]# make install
1.3 配置数据库相关
1.3.1 拷贝脚本文件
[root@server1 support-files]# pwd
/usr/local/mysql/support-files
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
1.3.2 新建用户(用于访问数据库)
# useradd -M -d /usr/local/mysql/ -s /sbin/nologin mysql
# tail -n 1 /etc/passwd
mysql:x:1001:1001::/usr/local/mysql/:/sbin/nologin
1.3.3 创建数据库目录
# mkdir -p /data/mysql
# chown mysql.mysql /data/mysql
1.3.4 添加变量
[root@server1 support-files]# cd
[root@server1 ~]# vim .bash_profile
[root@server1 ~]# source .bash_profile
1.3.5 修改配置(/etc/my.cnf)
[root@server1 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
这里的mysql日志全部写默认目录,无法重定义其他目录
1.3.6 初始化数据库(得到首次登陆密码)
[root@server1 ~]# mysqld --initialize --user=mysql
1.4 启动数据库
[root@server1 my.cnf.d]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/server1.err'.
SUCCESS!
初次进入数据库设置数据库密码
1.5 可视化数据库管理插件
下载插件到server1上,phpMyAdmin是一款php语言开发的可视化数据库管理界面。
解压,移动到nginx发布目录
[root@server1 ~]# unzip phpMyAdmin-5.0.2-all-languages.zip # 解压
[root@server1 ~]# mv phpMyAdmin-5.0.2-all-languages /usr/local/nginx/html/phpadmin # 放到nginx发布目录
[root@server1 ~]# nginx # 如果nginx服务未开启,打开它
浏览器访问172.25.200.1/phpadmin
登陆错误问题解决
[root@server1 etc]# pwd
/usr/local/lnmp/php/etc
[root@server1 etc]# vim php.ini
[root@server1 etc]# systemctl reload php-fpm.service
登陆成功,可以在此界面管理数据库
2、mysql主从复制—基于二进制日志复制
2.1 按照server1的步骤,在server2上安装启动数据库
由于环境一样,直接将server1上编译好的mysql5.7拷贝到server2上
2.2 主从复制配置
2.2.1 master设置
复制拓扑中的每个服务器都必须配置有唯一的服务器ID,您可以使用server_id系统变量指定该ID 。此服务器ID用于标识复制拓扑中的各个服务器,并且必须是1到(2的32次幂)-1之间的正整数。您可以server_id通过发出如下语句来动态更改值:
SET GLOBAL server_id = 1; //在线生效,mysql8默认id为1
默认服务器ID为0时
,master和slave互不连接,因此该值不能在复制拓扑中使用。除此之外,您还可以选择组织和选择服务器ID的方式,只要每个服务器ID与复制拓扑中任何其他服务器使用的每个其他服务器ID不同
即可。请注意,如果先前为服务器ID设置的值为0,则必须重新启动服务器以使用新的非零服务器ID初始化源。否则,不需要重新启动服务器,除非您需要启用二进制日志记录或进行其他需要重新启动的配置更改。
必须在master上启用二进制日志记录,因为二进制日志是将更改从master复制到其slave的基础。如果使用该log-bin
选项未在master上启用二进制日志记录,则无法进行复制。要在尚未启用二进制日志记录的服务器上启用二进制日志记录,必须重新启动服务器。在这种情况下,请关闭MySQL服务器并编辑 my.cnf或my.ini文件。在[mysqld]配置文件的部分中,添加log-bin和 server-id选项。如果这些选项已经存在,但已被注释掉,请取消注释这些选项并根据需要进行更改。例如,要使用日志文件名前缀启用二进制日志记录mysql-bin并将服务器ID配置为1,请使用以下几行:
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1
master创建复制用户:
每个slave使用MySQL用户名和密码连接到master,因此master上必须有一个用户,让slave用于连接。设置slave时,用户名由命令MASTER_USER
上的选项指定 CHANGE MASTER TO
。只要已被授予REPLICATION SLAVE
特权,任何帐户都可以用于此操作。您可以选择为每个slave创建一个不同的帐户,或为每个slave使用相同的帐户连接到master。
要创建一个新帐户,请使用CREATE USER
。要向该帐户授予复制所需的特权,请使用以下GRANT
语句。如果仅出于复制目的创建帐户,则该帐户仅需要 REPLICATION SLAVE
特权。例如,要设置一个新用户,repl该用户可以从example.com域内的任何主机进行复制连接,请在master上使用以下命令:
CREATE USER 'repl'@'172.25.200.%' IDENTIFIED BY 'westos';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.200.%';
回去查一下加不加单引号区别!?
2.3 slave设置
2.4 测试
3、mysql主从复制—基于GTID复制
3.1 master配置
[root@server1 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
[root@server1 ~]# /etc/init.d/mysqld restart
3.2 slave配置
[root@server2 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
[root@server2 ~]# /etc/init.d/mysqld restart
[root@server2 ~]# mysql -pwestos
mysql> stop slave;
mysql> change master to
master_host='172.25.200.1',
master_user='repl',
master_password='westos',
master_auto_position=1;
mysql> show slave status\G;
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.3 测试
在server2上
mysql> select * from gtid_executed;
Empty set (0.00 sec) ## 空是因为数据库还未变动
在server1库里添加内容
mysql> INSERT INTO mysql-test.test values ('222','33');
Query OK, 1 row affected (0.04 sec)
mysql> select * from test;
+------+-----+
| name | age |
+------+-----+
| 111 | 25 |
| 222 | 33 |
+------+-----+
此时回到server2上已经看到gtid表中有同步数据
mysql> select * from gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 5b488e4b-afdb-11eb-a7f9-525400512725 | 1 | 1 |
+--------------------------------------+----------------+--------------+
1 row in set (0.00 sec)
4、mysql主从复制—半同步复制(基于GTID)
数据库的主从复制依赖网络同步,slave总是滞后于master,如果存在网络环境糟糕,延时过大,如存在几个小时的延时数据,这样会大大增加数据丢失风险,在一些特殊场合数据要比节约同步时间更重要,如银行,重要数据中心等,因此必须保证数据的安全性,半同步复制的意思是当数据已经到达slave端进行备份,才会给master返回确认信息,这时候,数据才被真正的写入数据库。
4.1 设置master与slave
半同步复制:
master:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled =1;
SHOW STATUS LIKE 'Rpl_semi%';
slave:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
查看状态(master)
mysql> show variables like 'rpl%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_stop_slave_timeout | 31536000 |
+-------------------------------------------+------------+
mysql> SHOW STATUS LIKE 'Rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 1 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1127 |
| Rpl_semi_sync_master_tx_wait_time | 1127 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
查看状态(slave)
mysql> show status like 'Rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
4.2 测试
master端
slave端
master端
本篇文章到此结束,下一篇文章写数据库主从复制的组合方式