mysql

mysql

mysql源码安装

```

####下载源码安装需要用到的软件

[root@mysql_1 ~]# yum install cmake gcc-c++ openssl-devel -y

[root@mysql_1 ~]# yum install ncurses-devel.x86_64 rpcgen.x86_64 -y

#导入libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm

[root@mysql_1 ~]# yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm -y

##########

导入mysql-boost-5.7.44.tar.gz

[root@mysql_1 ~]# tar zxf mysql-boost-5.7.44.tar.gz

[root@mysql_1 ~]# cd mysql-5.7.44/

####源码编译安装mysql

[root@mysql_1 mysql-5.7.44]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/

[root@mysql_1 mysql-5.7.44]# make -j2 && make install #会很慢

```

部署mysql

[root@mysql-node1 ~]# mkdir /data/mysql -p

[root@mysql-node1 ~]# useradd -s /sbin/nologin -M mysql

[root@mysql-node1 ~]# chown -R mysql.mysql /data/mysql

[root@mysql-node1 ~]# cd /usr/local/mysql/support-files/

[root@mysql-node1 support-files]# cp mysql.server /etc/init.d/mysqld

[root@mysql-node1 support-files]# vim ~/.bash_profile

PATH=PATH:HOME/bin:/usr/local/mysql/bin

[root@mysql-node1 support-files]# source ~/.bash_profile

[root@mysql-node1 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

[root@mysql-node1 ~]# mysqld --user mysql --initialize #初始化

[root@mysql-node1 ~]# /etc/init.d/mysqld start

[root@mysql-node1 ~]# yum install chkconfig -y

[root@mysql-node1 ~]# mysql_secure_installation #重新设置密码

从一台已经源码安装好的快速安装另一台

[root@mysql-node1 ~]# yum install rsync -y #俩台都要安装

[root@mysql-node1 ~]# rsync -al -r mysql root@172.25.250.10:/usr/local

[root@mysql-node2 ~]# yum install rsync -y

[root@mysql-node2 ~]# mkdir /data/mysql -p

[root@mysql-node2 ~]# useradd -s /sbin/nologin -M mysql

[root@mysql-node2 ~]# chown -R mysql.mysql /data/mysql

cp mysql.server /etc/init.d/mysqld

[root@mysql-node1 support-files]# vim ~/.bash_profile

PATH=PATH:HOME/bin:/usr/local/mysql/bin

[root@mysql-node2 support-files]# source ~/.bash_profile

[root@mysql-node2 ~]# mysqld --user mysql --initialize

[root@mysql-node2 ~]# cd /usr/local/mysql/

[root@mysql-node2 mysql]# cd s

share/ support-files/

[root@mysql-node2 mysql]# cd s

share/ support-files/

[root@mysql-node2 mysql]# cd support-files/

[root@mysql-node2 support-files]# cp mysql.server /etc/init.d/mysql

[root@mysql-node2 support-files]# /etc/init.d/mysql start

主从复制

在node1

[root@mysql-node1 ~]# vim /etc/my.cnf

[root@mysql-node1 ~]# /etc/init.d/mysql restart

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

log-bin=mysql-bin

server-id=1

#进入数据库配置用户权限

[root@mysql-node1 ~]# mysql -p123

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123'

-> ;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 | 350 | | | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

mysql> exit

Bye

[root@mysql-node1 ~]# cd /data/mysql/

[root@mysql-node1 mysql]# mysql

mysql mysql_config_editor mysqlimport mysql_ssl_rsa_setup

mysqladmin mysqld mysql_install_db mysqltest

mysqlbinlog mysqld_multi mysql_plugin mysqltest_embedded

mysqlcheck mysqld_safe mysqlpump mysql_tzinfo_to_sql

mysql_client_test mysqldump mysql_secure_installation mysql_upgrade

mysql_client_test_embedded mysqldumpslow mysqlshow mysqlxtest

mysql_config mysql_embedded mysqlslap

[root@mysql-node1 mysql]# mysqlbinlog mysql-bin.000001 -vv #查看二进制文件

配置salve

[root@mysql-node2 ~]# vim /etc/my.cnf

[root@mysql-node2 ~]# /etc/init.d/mysql restart

Shutting down MySQL. SUCCESS!

Starting MySQL. SUCCESS!

[root@mysql-node2 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=2

mysql> CHANGE MASTER TO CHANGE MASTER TO MASTER_HOST='172.25.250.10',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=350

mysql> start slave;

mysql> SHOW SLAVE STATUS\G;

mysql> CREATE DATABASE ll;

Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE ll.userlist(

-> username varchar(20) not null,

-> password varchar(50) not null

-> );

Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO ll.userlist VALUE('liming','123');

Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM ll.userlist;

+----------+----------+

| username | password |

+----------+----------+

| liming | 123 |

+----------+----------+

1 row in set (0.00 sec)

#node2

mysql> SELECT * FROM ll.userlist;

+----------+----------+

| username | password |

+----------+----------+

| liming | 123 |

+----------+----------+

1 row in set (0.00 sec)

#从服务器只能读

node1

nide2

### node2的只能读不能写

当有数据添加slave2

[root@mysql-node3 mysql]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3

#从mater节点备份数据

[root@mysql-node1 ~]# mysqldump -uroot -p123 ll > ll.s

[root@mysql-node1 ~]# scp ll.sql root@172.25.250.30:/root
root@172.25.250.30's password:
ll.sql

[root@mysql-node3 ~]# mysql -uroot -p123 -e "create database ll;"

[root@mysql-node3 ~]# mysql -uroot -p123 ll<ll.sql

[root@mysql-node3 ~]# mysql -uroot -p123 -e "select * from ll.userlist;"

配置slave2的slave功能

在master查询日志pos

[root@mysql-node1 ~]# mysql -uroot -p123 -e "SHOW MASTER STATUS;"

mysql: [Warning] Using a password on the command line interface can be insecure.

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000003 | 793 | | | |

+------------------+----------+--------------+------------------+-------------------+

在node3中

mysql> CHANGE MASTER TO MASTER_HOST='172.25.250.10',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=793;

mysql> start slave;

mysql> SHOW SLAVE STATUS\G;

测试

[root@mysql-node1 ~]# mysql -uroot -p123 -e "INSERT INTO ll.userlist VALUES('user1','123');"

延迟复制

#在slave端

mysql> STOP SLAVE SQL_THREAD;

Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_DELAY=60;

Query OK, 0 rows affected (0.00 sec)

mysql> START SLAVE SQL_THREAD;

Query OK, 0 rows affected (0.01 sec)

mysql> SHOW SLAVE STATUS\G;

在master里面插入数据

[root@mysql-node1 ~]# mysql -uroot -p123 -e "INSERT INTO ll.userlist VALUES('user2','123');"

在设置的slave延迟时间到了才能查询到

慢查询日志

定义:慢查询,顾名思义,执行很慢的查询 当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个 SQL语句就是需要优化的 慢查询被记录在慢查询日志里 慢查询日志默认是不开启的 如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。

开启慢查询日志

mysql> SET GLOBAL slow_query_log=ON;

mysql> SET long_query_time=4;

mysql> SHOW VARIABLES like "long%";

mysql> SHOW VARIABLES like "slow%";

测试

mysql的并行复制

默认情况下slave中使用的是sql单线程回放 在master中时多用户读写,如果使用sql单线程回放那么会造成组从延迟严重 开启MySQL的多线程回放可以解决上述问题
在slaves中设定

[root@mysql-node2 ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=2

gtid_mode=ON

enforce-gtid-consistency=ON

slave-parallel-type=LOGICAL_CLOCK #基于组提交,

slave-parallel-workers=16 #开启线程数量

master_info_repository=TABLE #master信息在表中记录,默认记录 /data/mysql/master.inf

relay_log_info_repository=TABLE #回放日志信息在表中记录,默认记录在/data/mysql/relay-log.info

relay_log_recovery=ON #日志回放恢复功能开启

[root@mysql-node2 ~]# /etc/init.d/mysql restart

此时sql线程转化为协调线程,16个worker负责处理sql协调线程发送过来的处理请求

半同步模式

原理

1.用户线程写入完成后master中的dump会把日志推送到slave端

2.slave中的io线程接收后保存到relaylog中继日志

3.保存完成后slave向master端返回ack

4.在未接受到slave的ack时master端时不做提交的,一直处于等待当收到ack后提交到存储引擎

5.在5.6版本中用到的时after_commit模式,after_commit模式时先提交在等待ack返回后输出ok

理解

MySQL 的半同步模式是一种在主从复制中提高数据一致性的机制。

在传统的异步复制中,主库在执行事务提交后,不会等待从库确认收到事务日志就会返回给客户端事务提交成功的响应。这可能导致在主库故障时,某些已经提交的事务还未同步到从库,从而造成数据丢失。

而半同步复制模式下,主库在提交事务时,会等待至少一个从库确认已经接收到事务的二进制日志,然后主库才会向客户端返回事务提交成功的响应。

半同步模式在一定程度上保证了数据的一致性,但也会带来一些性能开销,因为主库需要等待从库的确认。同时,如果所有从库都长时间没有响应,主库可能会切换回异步复制模式以避免阻塞。

gtid模式

#在master端和slave端开启gtid模式

[root@mysql-node1 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

log-bin=mysql-bin

server-id=1

gtid_mode=ON

enforce-gtid-consistency=ON

symbolic-links=0

[root@mysql-node1 ~]# /etc/init.d/mysql restart

[root@mysql-node2 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=2

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

[root@mysql-node2 ~]# /etc/init.d/mysql restart

[root@mysql-node3 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=3

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

[root@mysql-node3 ~]# /etc/init.d/mysql restart
#停止slave端

[root@mysql-node3 ~]# mysql -p123 #node2和node3

mysql> stop slave;
#开启slave端的gtid

mysql> CHANGE MASTER TO MASTER_HOST='172.25.250.10',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_AUTO_POSITION=1;

启用半同步模式

在master端启用

[root@mysql-node1 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

log-bin=mysql-bin

server-id=1

gtid_mode=ON

enforce-gtid-consistency=ON

symbolic-links=0

rpl_semi_sync_master_enabled=1

[root@mysql-node1 ~]# mysql -p123

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

###安装半同步插件

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

###查看插件情况

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

#打开半同步功能

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

##查看半同步功能状态

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

在slave端开启半同步功能

[root@mysql-node2 ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=2

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

rpl_semi_sync_master_enabled=1 #开启半同步功能

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> STOP SLAVE IO_THREAD; ###重启io线程,半同步才能生效

mysql> START SLAVE IO_THREAD;

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

测试

在master端写入数据

mysql> insert into ll.userlist values ('user4','123');

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

模拟故障

#在slave端

[root@mysql-node2 ~]# mysql -p123

mysql> STOP SLAVE IO_THREAD;

[root@mysql-node3 ~]# mysql -p123

mysql> STOP SLAVE IO_THREAD;

master里面

mysql组复制

#在mysql-node1中

[root@mysql-node1 ~]# rm -fr /data/mysql/

[root@mysql-node1 ~]# vim /etc/my.cnf

mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=1

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW

plugin_load_add='group_replication.so'

transaction_write_set_extraction=XXHASH64

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off

group_replication_local_address="172.25.250.10:33061"

group_replication_group_seeds="172.25.250.10:33061,172.25.250.20:33061,172.25.250.30:33061"

group_replication_ip_whitelist="172.25.250.0/24,127.0.0.1/8"

group_replication_bootstrap_group=off

group_replication_single_primary_mode=OFF

group_replication_enforce_update_everywhere_checks=ON

group_replication_allow_local_disjoint_gtids_join=1

[root@mysql-node1 ~]# mysqld --user=mysql --initialize

[root@mysql-node1 ~]# /etc/init.d/mysqld start

[root@mysql-node10 ~]# mysql -uroot -p初始化后生成的密码 -e "alter user root@localhost identified by '123';"

#配置sql

[root@mysql-node1 ~]# mysql -p123

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY '123';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';

mysql> SET GLOBAL group_replication_bootstrap_group=ON;

mysql> START GROUP_REPLICATION;

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

mysql> SELECT * FROM performance_schema.replication_group_members;

#在复制配置文件到myql-node20和mysql-node30

[root@mysql-node2 ~]#scp /etc/my.cnf root@172.25.250.20:/etc/my.cnf

[root@mysql-node2 ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=2

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW

plugin_load_add='group_replication.so'

transaction_write_set_extraction=XXHASH64

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off

group_replication_local_address="172.25.250.20:33061"

group_replication_group_seeds="172.25.250.10:33061,172.25.250.20:33061,172.25.250.30:33061"

group_replication_ip_whitelist="172.25.250.0/24,127.0.0.1/8"

group_replication_bootstrap_group=off

group_replication_single_primary_mode=OFF

group_replication_enforce_update_everywhere_checks=ON

group_replication_allow_local_disjoint_gtids_join=1

[root@mysql-node1 ~]# mysqld --user=mysql --initialize

[root@mysql-node1 ~]# /etc/init.d/mysqld start

[root@mysql-node10 ~]# mysql -uroot -p初始化后生成的密码 -e "alter user root@localhost identified by '123';"

#配置sql

[root@mysql-node1 ~]# mysql -p123

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY '123';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';

mysql> SET GLOBAL group_replication_bootstrap_group=ON;

mysql> START GROUP_REPLICATION;

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

mysql> SELECT * FROM performance_schema.replication_group_members;

测试

在node1上面

mysql> CREATE TABLE bwmis.userlist(

-> username VARCHAR(10) PRIMARY KEY NOT NULL,

-> password VARCHAR(50) NOT NULL-> );

mysql>INSERT INTO bwmis.userlist VALUES ('user1','123'); node1上面

mysql>INSERT INTO bwmis.userlist VALUES ('user2','123') node2上面

mysql>INSERT INTO bwmis.userlist VALUES ('user1','123') node3上面

mysql路由

是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略 来处理连接,使其连接到正确的MySQL数据库服务器

[root@mysql-mha ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm

[root@mysql-mha ~]# vim /etc/mysqlrouter/mysqlrouter.conf

相关推荐
月光晒了很凉快12 分钟前
数据库锁有哪些?什么是死锁?
数据库·mysql
灿彬垂死挣扎ing27 分钟前
PLSQL-将一份excel数据导入到一张物理表(Oracle)
数据库·oracle·excel
Hsu琛君珩35 分钟前
【Redis】Redis 典型应用 - 分布式锁原理与实现
数据库·redis·分布式
微然02213 小时前
QT操作数据库
数据库
MonkeyKing_sunyuhua3 小时前
实现 Excel 文件导入到向量数据库(Milvus),并支持 先查询知识库(Milvus),然后再查询大模型(Ollama) 的功能
数据库·excel·milvus
往事随风吧@3 小时前
Oracle临时表
数据库·oracle
六百万~4 小时前
数据库MySQL
数据库·mysql
Czi橙4 小时前
SQL.LeetCode(1321)餐馆营业额变化增长
数据库·sql·mysql·leetcode
Feelings◎7 小时前
数据库——MySQL概述
数据库·mysql·oracle
T0uken8 小时前
【Linux】 LTG:移动硬盘部署Ubuntu24.04
linux·运维·数据库