首页 > 数据库 >mysql

mysql

时间:2023-12-14 18:12:29浏览次数:30  
标签:slave name -- 备份 master mysql

mysql

1、安装

# mysql 5.7
- name: 准备mysql安装包
  copy:
    src: /mysqlsql-{{ MYSQL_VERSION }}.tar.gz
    dest: /usr/local/mysql-{{ MYSQL_VERSION }}.tar.gz
- name: 解压mysql安装包
  shell: tar -xf /usr/local/mysql-{{ MYSQL_VERSION }}.tar.gz -C /usr/local
- name: 更改目录文件名称为mysql
  shell: mv /usr/local/mysql-{{ MYSQL_VERSION }}-* /usr/local/mysql
- name: 更改mysql目录权限
  shell: chown -R root:root /usr/local/mysql
- name: 创建mysql用户组
  group: name=mysql
- name: 创建mysql用户
  user: name=mysql group=mysql shell=/sbin/nologin
- name: 添加PATH环境变量
  shell: echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh && . /etc/profile.d/mysql.sh
- name: 准备配置文件
  template:
    src: my.cnf.j2
    dest: /etc/my.cnf
- name: 创建mysql数据目录
  file: path={{ DATA_DIR }} state=directory owner=mysql group=mysql mode=0755
- name: 创建数据库文件
  shell: /usr/local/mysql/bin/mysqld --initialize-insecure-insecure --user=mysql --basedir=/usr/local/mysql --datadir={{ DATA_DIR }}
- name: 复制mysqld
  shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld                                    
- name: 启动mysql服务
  shell: chkconfig --add mysqld && service mysqld start

2、多实例

# 创建多实例
mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid} &&  chown -R mysql.mysql /mysql
# 初始化
mysqld --initialize-insecure --user=mysql --datadir=/mysql/3308/data && mysqld --initialize-insecure --user=mysql --datadir=/mysql/3307/data && mysqld --initialize-insecure --user=mysql --datadir=/mysql/3306/data
# 配置实例配置文件
tee /mysql/3306/etc/my.cnf << EOF
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid
EOF
sed 's/3306/3307/' /mysql/3306/etc/my.cnf > /mysql/3307/etc/my.cnf && sed 's/3306/3308/' /mysql/3306/etc/my.cnf > /mysql/3308/etc/my.cnf
# 准备启动脚本
tee /mysql/3307/bin/mysqld << eof
#!/bin/bash

port=3307
mysql_user="root"
mysql_pwd="123456"
cmd_path="/usr/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
    {   
    if [ ! -e "$mysql_sock" ];then
        printf "Starting MySQL...\n"
        ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
    else
        printf "MySQL is running...\n"
        exit
    fi
    }

function_stop_mysql()
    {
    if [ ! -e "$mysql_sock" ];then
        printf "MySQL is stopped...\n"
        exit
    else
        printf "Stoping MySQL...\n"
        ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
    fi
    }

function_restart_mysql()
    {
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
    }
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
eof

3、备份和恢复

3.1 备份分类

# 完全备份
备份整个数据库集合
# 部分备份
备份部分库和表
# 增量备份
以前一天为基准,只备份比前一天增加的数据,一般第一天的数据要求全备
# 差异备份
第一天全备,以后只备份比第一天增加的数据
# 冷备
停止读写及服务进行备份
# 温备
可读不可写,进行备份
# 热备
正常提供服务进行备份
# 物理备份
使用复制手段,将数据整个复制走
# 逻辑备份
从数据库中到处数据另存

3.2 备份要点

# 数据
# 二进制日志,innodb事务日志
# 用户账号,权限,程序代码(函数,存储过程,触发器,事件调度器)
# 服务器的配置文件
# 备份完成后要做还原演练,保证数据的可恢复性
# 备份要规范化,整理成文档

3.3 备份工具

# 物理备份
cp,tar
# 逻辑备份
mysqldump

3.4 备份步骤

# 物理备份
找到mysql配置文件,备份配置文件
查看配置文件,mysql数据存放位置,将其使用tar打包
使用rsync或scp将文件复制到其余节点或存储在u盘
# 恢复
恢复配置文件和数据文件
注意权限问题
# 逻辑备份
mysqldump
选项
	-A 全备,备份所有的数据库
	-B db_name 备份部分数据库
	-E 备份事件调度器
	-R 备份存储过程和函数
	--triggers 备份触发器 --skip-triggers 不备份触发器
	--default-character-set=utf8 指定字符集
	--master-data[=n] 
	-F 备份钱滚动日志,锁定表完成后,生成新的二进制日志
	-x 配合-F在全部备份时只刷新一次日志
	-d 只备份表结构,不备份表中的数据
	-t 只备份数据不备份表结构
	-f 忽略sql错误强制备份
	--hex-blob 使用十六进制转储二进制
	-q 不缓存查询,只备份,可以加快速度
	innodb选项
	--single-transaction
# innodb建议备份策略
mysqldump -uroot -p -A -F -E -R --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >${BACKUP}/fullbak_${BACKUP_TIME}.sql
备份前滚动日志,备份完成后生成新日志,备份全部表格,备份时间调度器,备份存储过程和函数,备份触发器,指定字符集,以十六进制转储
# myisam建议备份策略
mysqldump -uroot -p -A -F -E -R -x --master-data=1 --flush-privilegestriggers--default-character-set=utf8 --hex-blob >${BACKUP}/fullbak_${BACKUP_TIME}.sql

4、sql语句

4.1 字符集和排序规则

# 查看支持的字符集和排序规则
SHOW CHARACTER SET;
SHOW COLLATION;
# 查看当前使用的字符集和排序规则
show variables like 'character%';
show variables like 'collation%';
# 设置默认字符集
vim /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4

4.2 数据类型

4.2.1 整数型

分为1,2,3,4,8字节,一字节等于8个二进制位,能表示2^8位数字,此数据可以通过修饰符改变为正整数,默认是带-号的基于0的对称数字
tinyint(m) smallint(m) mediumint(m) int(m) bigint(m) m表示查询时显示的宽度,不影响数据存储

4.2.2 bool

非真即假
与tinyint(1)为同义词 0被视为真,非0被视为假

4.2.3 浮点数

# float
float(m,d) 单精度浮点型 8位精度(4字节)
# double
double(m,d) 双精度浮点型16位精度(8字节)
m总个数,d小数位, 注意: 小数点不占用总个数,若数据超出限制将会被四舍五入

4.2.4 定点数

decimal(m,d) 
最多 m 位数字,其中 d 个小数,小数点不算在长度内
每4个字节存储9个数字,小数点占1字节
一般用来针对小数进行精确计算时使用此数据

4.2.4 字符串

# 固定长度
char(n) 最长255字符,2^8 注意与字节的区别,字符为表示单位,字节为存储单位
若存储字符小于定义长度,那么固定占用空间,并将其后面补位空格,此类型数据后面不能有空格
# 可变长度
varchar(n) 最长65535字符 2^16
占用空间不固定,为字符占用+1字节,
检索速度char 大于 varchar

4.2.5 时间

data 日期 2021-12-23
time 时间 16:33:30
datetime 2021-12-23 16:22:45
YEAR(2), YEAR(4) 年份

4.2.6 枚举

从指定的选项中选出一个
ENUM('M','F')

4.2.7 修饰符

# 修饰符用来对定义的数据进行额外属性的添加
# 适用于所有数据的修饰符
null 空
not null 非空
default 默认值
primary key 主键
unique key 唯一键
CHARACTER SET name 指定一个字符集
timestamp 自动存储记录修改时间适用于时间数据
# 适用于数值类的修饰符
AUTO_INCREMENT[=n] 自动递增,适用于key,基于整数 可以定义初始与步进n为初始值。默认步进为1,默认初始值为1
show variables like 'incre%';
UNSIGNED 移除符号,将数字范围从 -1--1 变为 0-2

4.3 数据库管理

# 创建数据库
useg: create database if not exists k8s character set 'utf8mb4' collate 'utf8mb4_general_ci'; 
目录关系: 数据库db一般存在于数据目录下,以目录形式存在
ll /data/mysql/k8s
# 修改数据库
alter database k8s character set utf8;
# 查看数据库创建信息
show create database k8s;
# 删除数据库
drop database if exists k8s;
# 变量管理
查看: show variables like 'auto_%';
更改: set @@name=value;

4.4 表管理

# 创建表
1、直接创建
create table tb_name (字段1 类型 修饰符,字段2 类型 修饰符) ENGINE [=] engine_name [AUTO_INCREMENT=n] [default charset utf8];
2、通过查询创建
create table k8s_select select * from k8s_table;
3、创建和其他表一样的表结构
create table k8s_copy like k8s_table;
# 查看表
1、查看某数据库中的某张表
show tables from db_name;
2、查看表的创建命令
show create table tb_name;
3、查看标的状态
show table status like 'k8s_copy';
4、 查看表的结构
desc tb_name;
# 修改表
1、修改表
alter table tb_name subcommand 
	subcommand:
		add col1 data_type [FIRST|AFTER col_name] # 添加一列,指定列的名称,数据类型,指定在首位或者在哪个字段之后
		drop col_name # 删除某列
		change # 改变字段名称同时也可改变类型
		modify # 改变字段的属性,比如int改为txet
		rename tb_name # 改变表名称
# 删除表
drop table tb_name;

4.5 数据管理

# 插入数据
insert tb_name[(字段1,字段2)] valu(字段1值,字段2值) # 若不指定字段默认valu需要输入所有字段的值
# 更新数据
更新数据必须指定条件限制,否则默认更改全部的列,可以在配置文件配置,若无限制条件那么无法进行更新
[mysql]
safe-updates
update tb_name set 字段=value [where 条件]
# 删除数据
删除数据需要指定条件否则默认清空全表
delete from tb_name where 条件
TRUNCATE TABLE k8s_tb; 情况表但保留表结构
# 查询数据
别名  字段1 as f 将字段名称使用f来命名
where子句 
	算数表达式 + - * / %
	比较表达式 > < >= <= = <=>(相等或都为空)
	between a and b 在两者之间
	in(条件1,条件2) | not in 判断是否在容器内
	is null|not null 判断是否为空
	distinct 去除重复行,相当于python中的集合
		select distinct gender from students ;
	模糊查询 %表示任意字符,_表示单个字符
	逻辑表达式 and or not
	正则表达式 REGEXP rlike
group by 分组 如果指定了分组,那么select后面只能跟分组的列和对齐聚合运算的结果
	后面跟两个条件,会将两个条件分别组合
聚合运算
	count()统计总数
	sum()计算总和
	max()最大值
	min()最小值
	avg()平均数
	having 对聚合运算后的结果进行过滤
order by 排序
	asc 升序,默认为升序
	desc 降序
limit[[1],3] 限制结果输出数 1表示从第一行开始默认从0开始,3表示三行
# 多表查询
子查询 基于某sql语句的查询结果进行再查询,可用于单表或多表
	1、用来进行比较运算的子查询,语义较为接近自然理解 比如
	SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM teachers);
	查询出学生年龄比教师平均年龄大的学生
	2、用于判断查询结果是否在一系列条件中,做容器in的判断 比如
	SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
	查询学生年龄满足和教师年龄一样的学生
	3、判断是否存在某条件
	select * from students s where EXISTS (select * from teachers t where s.teacherid=t.tid);
	将外查询结果逐条带入内查询中,exists 返回布尔值,若为真,外查询返回结果
	select * from students as s where s.teacherid in (select tid from teachers);
	查询学生表中教师id和老师表中教师tid相等的学生的信息
	4、 SELECT s.ClassID,s.aage FROM (SELECT ClassID,avg(Age) AS aage FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
	显示课程学生表中所有课程的学生的平均年龄大于30的学生
联合查询
	union
	将多个具有相同字段的表进行纵向合并,统一去重显示
	SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
内连接
	inner join 一般用 on 指定两个表中相同字段
	取两个表中的交集,将两个表中指定具有相同字段的其余字段拼接成为新的表
	select * from students as s inner join teachers as t on s.teacherid=t.tid;
外连接
	left join
	将两表以指定相同字段的key相交,取出存在于主表但去除两表相交和存在于右表的部分
完全外连接
	full  out join 
	将两个表指定相同的key字段相交去重

5、 视图

# view
保存真正的表的查询结果的虚拟表格
# 创建
create view view_name as select ...
# 查看
show tables;
show create table tb_name;
# 删除
drop view view_name;

6、 函数

7、 存储过程

8、 事件

9、 触发器

10、 用户管理

# 账号格式
用户名@网段
[email protected]
[email protected].%.% %表示通配符
user2@'192.168.1.%'
mage@'10.0.0.0/255.255.0.0' 可以使用子网掩码形式来放行网段
# 创建用户
create user quanheng@'172.31.3.1' IDENTIFIED BY '123456';
创建一个用户名为quanheng密码为123456 且可以从172.31.3.1这台主机连接过来的账号
# 查询
select host,user from mysql.user \G;
# 修改用户名
rename user quanheng@'ip' to guquanheng@'ip';
# 删除用户
drop user quanheng@'ip';
# 密码修改
SET PASSWORD FOR 'user'@'host' = PASSWORD('password'); 8.0以下
set password for root@'localhost'='123456'; 8.0
ALTER USER test@'%' IDENTIFIED BY 'centos';

11、 权限管理

# 授权
GRANT 
GRANT 权限类别 on 针对哪个类型的比如,数据库,表等 to user
GRANT ALL ON wordpress.* TO wordpress@'10.0.0.%' ; 针对wordpress下的所有表授予所有权限给wordpress用户
FLUSH PRIVILEGES;
# 取消权限
revoke
revoke ALL ON wordpress.* from wordpress@'10.0.0.%';
FLUSH PRIVILEGES;
# 查看用户权限
SHOW GRANTS FOR 'user'@'host';

12、 集群

12.1 主从复制

# 原理
利用二进制日志与中继日志,将主节点数据通过二进制日志传输到从节点,从节点利用二进制日志写入中继日志,转化为sql语句导入
# 步骤
主节点
    1、开启二进制日志
    vi /etc/my.cnf
    [mysqld]
    log_bin
    2、设置一个唯一的id
    [mysqld]
    server-id=1
    log-basename=master # datadir中日志名称,可选
    3、查看二进制日志位开始复制
    SHOW MASTER STATUS;  # 用在启动复制线程时
    4、创建拥有复制权限的账号
    create user slave@'172.31.3.%' identified by '123456'; # 创建
    grant replication slave on *.* to slave@'172.31.3.%'; # 授权
从节点
	1、启动中继日志
	[mysqld]
    server_id=2 为当前节点设置一个全局惟的ID号
    log-bin
    read_only=ON  #设置数据库只读,针对supper user无效
    relay_log=relay-log  #relay log的文件路径,默认值hostname-relay-bin
    relay_log_index=relay-log.index  #默认值hostname-relay-bin.index
    2、使用复制权限账号连接至主服务器,启动复制线程
    CHANGE MASTER TO MASTER_HOST='172.31.3.99',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-master-bin.000001',MASTER_LOG_POS=154;
    START SLAVE ;
    SHOW SLAVE STATUS;

12.2 级联复制

从节点再有从节点,步骤与主从类似,级联的slave配置如下
[mysqld]
server-id=18
log-bin
read-only
log_slave_updates
slave同步将master改为级联slave其余不变

12.3 主主复制

互为主从,数据互相复制,步骤与主从类似,注意点,需要将自动增长的id段隔开,有几个节点就将增长设为几
auto_increment_offset=2
auto_increment_increment=2

12.4 复制相关问题

12.4.1 监控

SHOW MASTER STATUS
SHOW BINARY LOGS
SHOW BINLOG EVENTS
SHOW SLAVE STATUS
SHOW PROCESSLIST

12.4.2 复制错误

SET GLOBAL sql_slave_skip_counter = N 设定跳过错误
[mysqld]
slave_skip_errors=1007|ALL 跳过所有错误

12.4.3 master宕机

master宕机后提升slave为新的master
查看从节点中继日志,确定哪一个节点拥有最新数据
cat /data/mysql/relay-log.info
将此节点设置为master节点
关闭read-only
[mysqld]
server-id=18
read-only=OFF
log-bin=/data/mysql/logbin/mysql-bin
清除旧的复制信息
set global read_only=off;
stop slave;
restart slave all;
做完备
mysqldump -A --single-transaction --master-data=1 -F > backup.sql
将挂掉的master二进制日志未同步的日志导出,恢复到新的master
其他节点重新从新master同步
stop slave;
reset slave all;
set sql_log_bin=off;
CHANGE MASTER TO MASTER_HOST='172.31.3.99',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-master-bin.000001',MASTER_LOG_POS=154;
set sql_log_bin=on;
START SLAVE ;

12.4.4 数据不一致

12.4.4.1 备库重搭

# 主库
mysqldump --set-gtid-purged=OFF --single-transaction --master-data=1 --all-databases > dump.sql
scp dump.sql 从库ip:/tmp/
show master status;
File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-master-bin.000006 |      790 |              |                  |                   |
+-------------------------+----------+--------------+------------------+-------------------+
记录file 和 pos
# 从库
STOP SLAVE;
reset slave all;
set sql_log_bin=off;
source /tmp/dump.sql
head -30 /tmp/dump.sql |grep ^CH # 记录MASTER_LOG_FILE MASTER_LOG_POS
CHANGE MASTER TO MASTER_HOST='172.31.3.99',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-master-bin.000006',MASTER_LOG_POS=790;
set sql_log_bin=on;
START SLAVE ;

12.4.4.2 手动同步

1、停止从库
stop slave;
2、主库备份缺失的表
mysqldump -uroot -p123456 -q --single-transaction --master-data=2 testdb A B C >/backup/A_B_C.sql
3、 查看备份文件,找出binlog和pos点
例
MASTERLOGFILE='mysql-bin.02', MASTERLOGPOS=111;
4、把备份的.sql文件拷贝到Slave机器上,并做指向新位置
start slave until MASTERLOGFILE='mysql-bin.02',MASTERLOGPOS=111;
5、重新导入sql
mysql -uroot -p123456 testdb
set sql_log_bin=0;
source /backup/A_B_C.sql
set sql_log_bin=1;
6、重新开启同步进程
start slave;

13、 读写分离

13.1 利用proxysql实现读写分离

# 安装
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
yum -y install proxysql
# 启动
service proxysql start
# 登录数据库,添加mysql节点
mysql -uadmin -padmin -P6032 -h127.0.0.1
select * from sqlite_master where name='mysql_servers'\G;
select * from mysql_servers;
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.31.3.100',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.31.3.99',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.31.3.102',3306);
load mysql servers to runtime;
save mysql servers to disk;
# 登录master 创建监控用用户
grant replication client on *.* to monitor@'172.31.3.%' identified by '123456';
FLUSH PRIVILEGES;
# 登录proxy节点验证账户权限
mysql -umonitor -p123456 -P3306 -h172.31.3.99
# 添加监控后端节点的用户,连接每个节点的read_only值来自动调整主从节点是属于读组还是写组
set mysql-monitor_username='monitor';
set mysql-monitor_password='123456';
load mysql variables to runtime;
save mysql variables to disk;
# 查看监控
select * from mysql_server_connect_log;
select * from mysql_server_ping_log;
# 设置分组信息
需要修改的是main库中的mysql_replication_hostgroups表
该表有3个字段:
writer_hostgroup,reader_hostgroup,comment, 
指定写组的id为10,读组的id为20,test为表名称
insert into mysql_replication_hostgroups values(10,20,"test"); 
load mysql servers to runtime;
save mysql servers to disk;
# 配置完成后Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组
select hostgroup_id,hostname,port,status,weight from mysql_servers;
# 登录主节点,创建用于访问数据库的sql用户
grant all on *.* to sqluser@'172.31.3.%' identified by '123456';
FLUSH PRIVILEGES;
# 登录ProxySQL 将用户sqluser添加到mysql_users表中
default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
insert into mysql_users(username,password,default_hostgroup) values('sqluser','123456',10);
load mysql users to runtime;
save mysql users to disk;
# 测试读写
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select @@server_id'
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'create database testdb'
mysql -usqluser -p123456 testdb -P6033 -h127.0.0.1 -e 'create table t(id int)'
# 读写正常后配置路由进行读写分离
与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing
插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句SELECT...FORUPDATE它会申请写锁,应路由到10的写组
insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql users to disk;
# 测试读
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select @@server_id'
# 测试写
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'start transaction;select @@server_id;commit;select @@server_id'
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'insert testdb.t values (1)'
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select id from testdb.t'
# 查询操作的路由信息
SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

mysql> SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;
+----+----------+------------+----------------------------------+
| hg | sum_time | count_star | digest_text                      |
+----+----------+------------+----------------------------------+
| 10 | 48638    | 1          | select * from hellodb.students   |
| 10 | 17336    | 1          | create table t(id int)           |
| 10 | 5697     | 1          | show databases                   |
| 10 | 5321     | 1          | insert testdb.t values (?)       |
| 20 | 4392     | 2          | select @@server_id               |
| 10 | 4140     | 2          | select @@server_id               |
| 10 | 3344     | 1          | create database testdb           |
| 20 | 1545     | 1          | select id from testdb.t          |
| 10 | 793      | 1          | start transaction                |
| 10 | 570      | 1          | commit                           |
| 10 | 0        | 8          | select @@version_comment limit ? |
| 10 | 0        | 1          | select @@version_comment limit ? |
+----+----------+------------+----------------------------------+
12 rows in set (0.00 sec)

mysql> 

14、 高可用-MHA

14.1 工作原理

1. MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events)
2. 识别含有最新更新的slave
3. 应用差异的中继日志(relay log)到其他的slave
4. 应用从master保存的二进制日志事件(binlog events)
5. 提升一个slave为新的master
6. 使其他的slave连接新的master进行复制

14.2 架构

image-20231214154236972

标签:slave,name,--,备份,master,mysql
From: https://www.cnblogs.com/guquanheng/p/17901717.html

相关文章

  • 手动安装LAMP——在 CentOS 7 上安装 PHP、Apache 和 MariaDB(替代 MySQL)
    在CentOS7上安装PHP、Apache和MariaDB(替代MySQL)的过程如下:1.更新系统:sudoyumupdate2.安装Apache:sudoyuminstallhttpd3.启动Apache服务并设置开机自启:sudosystemctlstarthttpdsudosystemctlenablehttpd4.安装MariaDB:sudoyuminstallmariadb-server......
  • MySQL哪些操作会记录至Binlog文件?
    参考:MySQL哪些操作会记录至Binlog文件?操作影响行数为0会写Binlog?https://juejin.cn/post/7066724038999015432Row模式下,会记录所有执行成功且返回的影响行数大于0的DDL和DML操作,当UPDATE和DELETE操作的影响行数为0时不会记录操作至Binlog。有如下疑问:mysql数据库没......
  • 连接MySQL报错{"Authentication to host 'PC10103' for user 'root' using method &#
    连接MySQL报错{"Authenticationtohost'PC10103'foruser'root'usingmethod'sha256_password'failedwithmessage:Accessdeniedforuser'root'@'PC10103'(usingpassword:YES)"}先在MySQL中执行如下查询SEL......
  • MySQL账号锁定与解锁
    MySQL提供了多种方法来锁定解锁账号,下面是几种常用的方法:1.使用ALTER语句锁定账号锁定账号:ALTERUSER'username'@'localhost'ACCOUNTLOCK;解锁账号:ALTERUSER'username'@'localhost'ACCOUNTUNLOCK;2.使用UPDATE语句锁定账号锁定账号:UPDATEmysql.userSETacco......
  • mysql 索引优化2
    对于关联sql的优化关联字段加索引,让mysql做join操作时尽量选择NLJ算法小表驱动大表,写多表连接sql时如果明确知道哪张表是小表可以用straight_join写法固定连接驱动方式,省去mysql优化器自己判断的时间 in和exsits优化原则:小表驱动大表,即小的数据集驱动大的数据集in:当B表的......
  • MySQL:SQL 错误 [1118] [42000]: Row size too large.
    1.场景:今天在用MySQL建表的时候,报了一个错误;SQL错误[1118][42000]:Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.Thisincludesstorageoverhead,checkthemanual.YouhavetochangesomecolumnstoTEXTor......
  • MySQL运维4-Mycat入门
    一、mycat概述mycat是阿里巴巴企业下的开源的,基于JAVA语言编写的MySQL数据库中间件,可以像使用MySQL一样来使用Mycat,对于开发人员来说根本感觉不到mycat的存在。之前在国内使用数据库分库分表,读写分离最主流的就是使用mycat,但是截止到今日2023-12-13日,mycat的网站的下载链接......
  • mysql的备份方法详解
    MySQL数据库备份是确保数据安全的重要步骤。有多种备份方法可用,以下是几种常见的MySQL备份方法:1.使用mysqldump命令行工具:mysqldump是MySQL提供的备份工具,通过命令行使用。以下是基本的备份和恢复示例:备份整个数据库:mysqldump-uusername-pdatabase_name>backup.sql......
  • JavaWeb - day07 - MySQL - DQL、多表设计
    01.MySQL-DQL-基本查询介绍DQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录。查询关键字:SELECT查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP......
  • MySQL使用JSON存储数据
    1.优点1.不用为数据中的每个key值新建一个字段,可以任意的增减字段而无需修改数据表结构,甚至可以减少数据表的设计。2.可以减少数据表的查询,减少关联查询,一个查询的结果就可以代替几个查询的结果,降低数据库服务器的压力。2.缺点1、json数据仅仅只能用于展示display,如果用于条件......