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

相关推荐
火山上的企鹅18 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
阿狸猿19 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩19 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮19 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@19 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能20 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng20 小时前
Redis初识
数据库·redis·缓存
cmes_love20 小时前
股票逐笔level2历史行情下载十档订单薄五档tick分钟下载分享
数据库·区块链
仙俊红20 小时前
SQL 调优需要掌握的知识
数据库·sql
fofantasy21 小时前
NSK LH12AN 微型导轨技术手册
运维·网络·数据库·经验分享·规格说明书