notes 图解mysql
notes 图解mysql
md 4/29/2022
安装配置mysql
which mysqld
/usr/sbin/mysqld
#查看mysql版本: 5.7.
mysql --version
mysql Ver 14.14 Distrib 5.7.33, for Linux (x86_64) using EditLine wrapper
# 修改mysql监听ip从127.0.0.1--->0.0.0.0开启远程登录访问
vim /etc/mysql/mysql.conf.d/mysqld.cnf
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
# 修改mysql默认编码从latin1--->utf8便于⽀持中文
mysql -uroot -p
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
> show variables like '%char%';
> create database test;
> use mysql;
> SELECT host FROM mysql.user WHERE user = "root";
+-----------+
| host |
+-----------+
1 / 52
notes-图解mysql.md 4/29/2022
| localhost |
+-----------+
1 row in set (0.00 sec)
# remote connect
mysql -uroot -p123456 -h192.168.0.18 test
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)
常⽤命令
// 登录
mysql -uroot -p
// 关闭、启动、重启
[sudo] service mysql stop
[sudo] service mysql start
[sudo] service mysql restart
// 退出
mysql> exit
mysql> quit
// 查看所有db文件
mysql> show databases;
// 选择db文件
mysql> use name;
// 创建db文件
mysql> create database name
2 / 52
notes-图解mysql.md 4/29/2022
// 删除db文件
mysql> drop database name
//// 表操作
// 列出所有表
mysql> show tables
// 创建⼀个名为t_name的新表:
create table t_name(
id int(10) not null auto_increment primary key,
name varchar(40),
pwd varchar(40)
) charset=gb2312;
// 删除名为t_name的数据表
drop table t_name
// 显⽰名为t_name的表的数据结构
describe t_name
或
show columns from t_name
// 将表t_name中的记录清空
delete from t_name
// 显⽰表t_name中的记录
select * from t_name
// 复制表结构
mysqldump -uUSER -pPASSWORD --no-data DATABASE TABLE > table.sql
// 更改表得的定义把某个栏位设为主键
ALTER TABLE t_name ADD PRIMARY KEY (col_name)
// 把主键的定义删除
ALTER TABLE t_name DROP PRIMARY KEY (col_name)
// 在t_name表中增加⼀个名为col_name的字段且类型为varchar(20)
alter table t_name add col_name varchar(20)
// 在t_name中将col_name字段删除
alter table t_name drop col_name
// 修改字段属性,注若加上not null则要求原字段下没有数据
alter table t_name modify col_name varchar(40) not null
(注,SQL Server200下的写法:Alter Table t_name Alter Column col_name varchar(30)
not null)
// 修改表名:
alter table t_name rename to new_tab_name
3 / 52
notes-图解mysql.md 4/29/2022
// 修改字段名:
alter table t_name change old_col new_col varchar(40)
(注:必须为当前字段指定数据类型等属性,否则不能修改)
// ⽤⼀个已存在的表来建新表,但不包含旧表的数据
create table new_t_name like old_t_name
//// 数据备份与回复:
执⾏外部的sql脚本:
备份数据库:(dos下)
mysqldump --opt school>school.bbb
mysqldump -u [user] -p [password] databasename > filename (备份)
mysql -u [user] -p [password] databasename < filename (恢复)
mysql索引失效的常⻅场景?
index存储结构
mysql默认引擎,InnoDB存储引擎, 使⽤B+Tree Index; 创建Table时,InnoDB会默认创建clustered index
MyISAM存储引擎,⽀持B+Tree Index,R Tree Index,Full-text Index; 创建Table时默认使⽤B+Tree index
table(id,name,age,address)
4 / 52
notes-图解mysql.md 4/29/2022
5 / 52
notes-图解mysql.md 4/29/2022
索引 B+ 树是按照「index value」有序排列存储的,只能根据前缀prefix进⾏比较。
回表 vs 索引覆盖
如何选择index+回表?
// id 字段为主键索引
select * from t_user where id=1;
1. 从clustered index中检索leaf node得到所有字段(id,name,age,address)
// name 字段为⼆级索引
select * from t_user where name="林某";
1. 从secondary index中检索leaf node获取primary key(id)
2. 根据primary key(id)从clustered index中检索leaf node得到所有字段
(id,name,age,address)
此过程 [回表]
index失效导致全表扫描
对索引使⽤%xxx或者%xxx%模糊匹配
索引 B+ 树是按照「index value」有序排列存储的,只能根据前缀prefix进⾏比较。
6 / 52
notes-图解mysql.md 4/29/2022
// name 字段为⼆级索引
select * from t_user where name like '%林';
select * from t_user where name like '%林%';
type=ALL 就代表了全表扫描,⽽没有⾛索引。
// name 字段为⼆级索引
select * from t_user where name like '林%';
1. type = range, key = index_name, Extra = Using index condition ⾛了secondary
index扫描得到id
2. 得到id之后在进⾏clustered index扫描,最终获取全部数据(id,name,age,address)
对index使⽤function
// name 为⼆级索引
select * from t_user where length(name)=6;
type=ALL 就代表了全表扫描,⽽没有⾛索引。
// 8.0之后使⽤function index
alter table t_user add key idx_name_length ((length(name)));
select * from t_user where length(name)=6;
type = ref, key = idx_name_length 使⽤了index
因为索引保存的是索引字段的index value,⽽不是经过函数计算后的value,⾃然就没办法⾛索引了。
从8.0以后增加了function index,可以对field进⾏function计算后的value建立index
对index进⾏expression计算
对index进⾏隐式cast
mysql数据类型转换规则
7 / 52
notes-图解mysql.md 4/29/2022
+----------+
1 row in set (0.00 sec)
mysql在遇到string和interger比较的时候,会将string⾃动转换为integer
// 增加⼀个phone varchar(30);
select * from t_user where phone = 1300000001;
===>等价于
select * from t_user where CAST(phone AS signed int) = 1300000001;
type= all
union key非最左匹配
// (a,b,c) 最左匹配原则
// a, (a,b)/(b,a), (a,b,c)/(a,c,b)/(b,a,c)/(b,c,a)/(c,a,b)/(c,b,a)
where a = 1;
where a = 1 and b = 2;
where b = 2 and a = 1;
where a = 1 and b = 2 and c = 3;
where c = 3 and b = 2 and a = 1;
where字句种的or
// 为age创建secondary index
select * from t_user where id = 1 or age = 18;
type = index_merge,key= PRIMARY,index_age, Extra = Using union(PRIMARY,index_age)
⾛索引扫描
index_merge表⽰对id和age分别进⾏索引扫描,然后merge结果
4个模糊查询题⽬
题⽬1:⼀个表有多个字段,其中 name 是索引字段,其他非索引,id 拥有⾃增主键索引。
题⽬2:⼀个表有2个字段,其中 name 是索引字段,id 拥有⾃增主键索引。
上⾯两张表,分别执⾏以下查询语句:
对于题⽬1: (id,name,other,...)
对于题⽬2: (id,name)
(id,a,b,c) PRIMARY,index_abc
9 / 52
notes-图解mysql.md 4/29/2022
s3,s4为什么选择全扫描⼆级索引树,⽽不扫描全表(聚簇索引)呢? 因为⼆级索引树的记录东⻄很少,就只有
「索引列+主键值」,⽽聚簇索引记录的东⻄会更多.
相同数量的⼆级索引记录可以比聚簇索引记录占⽤更少的存储空间,所以⼆级索引树比聚簇索引树⼩,这样遍
历⼆级索引的 I/O 成本比遍历聚簇索引的 I/O 成本⼩,因此「优化器」优先选择的是⼆级索引。
通常情况下⾛全扫描(type=all);
如果能够索引覆盖(id,name)/(id, a,b,c), 那么⾛全扫描⼆级索引树(type=index, key =
index_name/index_abc, Extra = Using where;Using index)
count(*)性能最差?
哪种 count 性能最好?
结论: count(*) = count(1) > count(primary key) > count(normal field)
count() 是⼀个聚合函数,函数的参数不仅可以是字段名,也可以是其他任意表达式,该函数作⽤是统计符合查
询条件的记录中,函数指定的参数不为 NULL 的记录有多少个。
10 / 52
notes-图解mysql.md 4/29/2022
总结
count(*)/count(0)/count(1)、 count(主键字段)在执⾏的时候,如果表⾥存在⼆级索引,优化器就
会选择key_len最⼩的⼆级索引进⾏扫描。
如果要执⾏ count(*)/count(0)/count(1)、 count(主键字段)时,尽量在数据表上建立⼆级索引,这
样优化器会⾃动采⽤ key_len 最⼩的⼆级索引进⾏扫描,相比于扫描主键索引效率会⾼⼀些。
不要使⽤ count(普通字段)来统计记录个数,因为它的效率是最差的,会采⽤全表扫描的⽅式来统计
innodb⽀持事务,MVCC, count(*)需要遍历所有记录
myisam 通过meta信息存储raw_count,由table lock保持⼀致性,因此count(*)时间复杂度是O(1),⽆需遍历
所有记录
如何优化 count(*)?
如果对⼀张⼤表经常⽤ count() 来做统计,其实是很不好的。 比如下⾯我这个案例,表 t_order 共有 1200+ 万
条记录,我也创建了⼆级索引,但是执⾏⼀次 select count() from t_order 要花费差不多 5 秒!
第⼀种,近似值 explain select count(*) from t_order; 得到近似值rows,但是只需要4ms
第⼆种,额外表保存真实值,查询很快,但是有维护成本
Tree的演化(索引为什么能提升性能?)
对n个元素进⾏search
扫描法: O(N)
binary search(⼆分查找): 排好序然后search, O(logN); ⼀次排序,多次search
Tree
11 / 52
notes-图解mysql.md 4/29/2022
Red-Black Tree
red-black 规则
query性能比AVL Tree差; insert/delete性能比AVL Tree好
Red-Black的应⽤
C++ map,multimap,multiset
Linux process scheduling算法CFS(完全公平调度)使⽤R-B tree来存储PCB
epoll使⽤R-B tree来存储socket fd
B+ Tree
12 / 52
notes-图解mysql.md 4/29/2022
m = 4; 允许4个⼦节点,每个node最多存储3个index, 4个pointer;
B+ 树就是为了拆分索引数据(index)与业务数据(data)的平衡多叉树
mysql为什么使⽤B+ Tree?
MySQL 的数据是持久化的,意味着数据(index+data)是保存到磁盘上
sector 512byte, 1 block = 8 sector = 4kb; linux下disk IO每次读取⼀个block的数据,即4kb
mysql在search的过程中,需要多次disk IO; 并且⽀持range search;
disk IO非常耗时,需要尽可能减少disk IO次数,提升每次IO读取数据的有效性
13 / 52
notes-图解mysql.md 4/29/2022
14 / 52
notes-图解mysql.md 4/29/2022
+------------------+-------+
1 row in set (0.00 sec)
R-tree(Rectangle tree)
⽤于空间数据index
R means rectangle
Trie
存储string prefix
MySQL性能优化
todo暂时不完整
mysql查询执⾏过程?
15 / 52
notes-图解mysql.md 4/29/2022
查询优化⼯作实际上就是遵循⼀些原则让MySQL的优化器能够按照预想的合理⽅式运⾏⽽已。
16 / 52
notes-图解mysql.md 4/29/2022
Steps
Cache:
SQL中可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进⾏缓存
可以将query_cache_type设置为DEMAND,这时只有加入SQL_CACHE的查询才会⾛缓存,其他查询则不
会
17 / 52
notes-图解mysql.md 4/29/2022
| Last_query_cost | 1040.599000 |
+-----------------+-------------+
# we need 1,040 random data page reads to execute the query
mysql性能优化tips
Scheme设计与数据类型优化 创建⾼性能索引(clustered index,secondary index, union index,unique index)
selectivity
索引的顺序对于查询是⾄关重要的,很明显应该把选择性更⾼的字段放到索引的前⾯,这样通过第⼀个
字段就可以过滤掉⼤多数不符合条件的数据。
primary key/unique index的选择性是1,这是最好的索引选择性,性能也是最好的。
Transaction
以转账transfer为例
transaction特性
ACID(Atomicity、Consistency、Isolation、Durability,即原⼦性、⼀致性、隔离性、持久性)
If your database (mysql innodb) is transactional, then there simply no way to execute sqls "outside of a
transaction".
mysql innodb引擎是⽀持transaction的, 所有执⾏的sqls语句(select/insert/update/delete)都是在
transaction中执⾏的;
18 / 52
notes-图解mysql.md 4/29/2022
19 / 52
notes-图解mysql.md 4/29/2022
mysql如何设置isolation level?
其中的level可选值有4个:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
MVCC
对于使⽤InnoDB存储引擎的表来说,它的clustered index记录中都包含必要的隐藏列
20 / 52
notes-图解mysql.md 4/29/2022
Read View如何⼯作?
m_ids:表⽰在⽣成ReadView时当前系统中活跃的(uncommitted)事务id列表。
min_trx_id:表⽰在⽣成ReadView时当前系统中活跃的(uncommitted)事务中最⼩的事务id,也就是m_ids
中的最⼩值。
max_trx_id:表⽰⽣成ReadView时系统中应该分配给下⼀个事务的id值。
creator_trx_id:表⽰⽣成该ReadView的事务的事务id。
如果可以访问,则返回该record; 如果不可以访问,则沿着roll_pointer寻找历史version,然后进⾏同样的
判断;直到最后⼀个version.
21 / 52
notes-图解mysql.md 4/29/2022
Repeatable Read例⼦
22 / 52
notes-图解mysql.md 4/29/2022
23 / 52
notes-图解mysql.md 4/29/2022
24 / 52
notes-图解mysql.md 4/29/2022
B提交之前V1=100, 提交之后V1=100
Session A Session B
SELECT * FROM t;
empty set
COMMIT;
SELECT * FROM t;
25 / 52
notes-图解mysql.md 4/29/2022
---------------------
| 1 | 2 |
---------------------
# Repeatable Read
#Session 1
begin;
select * from t where id=1; # 1,100
update t set a = 200 where id=1;
select * from t where id=1; # 1,200
#Session 2
delete from t where id=1; #implicit autocommit
#Session 1
select * from table; # 1,200
commit;
# Session 1
select * from table; # null
Read Committed例⼦
26 / 52
notes-图解mysql.md 4/29/2022
27 / 52
notes-图解mysql.md 4/29/2022
B提交之前V1=100, 提交之后V1=200
Lock
28 / 52
notes-图解mysql.md 4/29/2022
shared lock: S
exclusive lock: X
SS兼容,其他SX,XS,XX都不兼容
mysql autocommit
MySQL's storage engine is from MyISAM to InnoDB, and locks are from table locks to row locks.
innodb默认情况下autocommit = 1/ON
# 如何查看autocommit?
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
autocommit规则:
默认autocommit = 1; 所有的select/insert/update/delete语句都在⼀个独立的transaction中执⾏并⾃动提
交;
如何disable autocommit Disable autocommit by doing one of the following:
29 / 52
notes-图解mysql.md 4/29/2022
set autocommit=1;
# transaction 1: 每个sql都会隐式创建事务并⾃动提交
select * from t where id=1;
# transaction 2: 每个sql都会隐式创建事务并⾃动提交
select * from t where id=2;
# transaction 3
begin; # ⼿动开启事务
select * from t where id=1;
insert into t values (2),(3);
commit; # ⼿动提交
# transaction 4
set autocommit=0; # ⾃动开启事务
select * from t where id=1;
insert into t values (4),(5);
commit; # ⼿动提交
global lock
global read lock(FTWRL)主要⽤于backup database
如果不开启gloal read lock, 可以通过mysqldump --single-transaction开启事务来确保数据⼀致性,
# unlock tables;
释放gloal read lock
执⾏后,整个数据库就处于readonly状态了,这时其他线程执⾏以下write操作,都会被阻塞; 当前线程执⾏以下
操作non block,但会失败failed;
30 / 52
notes-图解mysql.md 4/29/2022
table locks
connection/session/thread是对应的概念
31 / 52
notes-图解mysql.md 4/29/2022
#unlock tables;
show open tables where in_use >=1;
例⼦1:
例⼦2:
32 / 52
notes-图解mysql.md 4/29/2022
例⼦3:
1. A lock table t;
2. A select t可以成功;
3. A select t2失败;
33 / 52
notes-图解mysql.md 4/29/2022
例⼦4(同时lock t和t2解决3的问题):
unlock tables;
lock tables t read 之后⼜来了⼀个lock tables t2 read or lock tables t write会将session
之前的所有lock释放;
34 / 52
notes-图解mysql.md 4/29/2022
MDL是隐式的,会在transaction commit之后释放;
35 / 52
notes-图解mysql.md 4/29/2022
1. begin开启事务
2. insert 获取MDL read lock;
3. alter释放之前的read lock, 重新获取MDL write lock;
4. select释放之前的write lock, 重新获取MDL read lock;
5. commit 之后释放最后⼀个MDL read lock;
36 / 52
notes-图解mysql.md 4/29/2022
intention Lock(IS,IX)
The main purpose of intention locks is to show that someone is locking a row, or going to lock a row in the
table. 意向锁的⽬的是为了快速判断表⾥是否有记录被加锁。 IS/IX表明table的某⼀⾏被lock了,那么在申请
table lock的时候,就可以快速判断是否有冲突,⽆需遍历所有的⾏进⾏判断
意向锁全部兼容; IS/IS,IS/IX,IX/IX互相兼容;
read/write;)
规则:
看⼀个例⼦:
判断Steps:
有没有快速⽅法?-> IS,IX
如何使⽤sql增加IS/IX?
AUTO-INC lock
insert row带有auto_increment
mode = 0, insert完毕就释放,⽆需等待commit;
38 / 52
notes-图解mysql.md 4/29/2022
row lock
row lock分类:
插入意向锁IIL是⼀种特殊的gap lock
在insert时,使⽤IIL代替常规的gap lock;
IIL age (10,20) age = 15; IIL age (10,20) age = 16; IIL 的gap lock区间相同,只要index不同,则T1和T2事务
之间就不会冲突等待;
解决了并发插入的问题
来看⼀个例⼦:
id name age
1 Mike 10
2 Jone 20
39 / 52
notes-图解mysql.md 4/29/2022
3 Tony 30
# T1
begin;
INSERT INTO users SELECT 4, 'Bill', 15;
# T2
begin;
INSERT INTO users SELECT 5, 'Louis', 16; # OK
#================================================
# case 1: 如果insert使⽤常规gap lock会如何?
#================================================
# t1事务:
table IX;
id-> record lock [4]
age-> gap lock(10,20) age = 15
# t2事务
table IX; (OK)
id-> record lock [5] (???)
age-> gap lock(10,20) age = 16 (T1已经lock了(10,20)区间,T2⽆法获取lock,所以
blocked...)
#================================================
# case 2: insert使⽤IIL替代常规gap lock
#================================================
# t1事务:
table IX;
id-> record lock [4]
age-> IIL gap lock(10,20) age = 15
# t2事务
table IX; (OK)
id-> record lock [5] (OK)
age-> IIL gap lock(10,20) age = 16 (OK, 2个IIL不冲突)
例⼦2
mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);
# T1
mysql> START TRANSACTION;
mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+
| id |
+-----+
| 102 |
+-----+
# T1加了gap lock (100,102]表明此区间不允许insert
40 / 52
notes-图解mysql.md 4/29/2022
# T2
mysql> START TRANSACTION;
mysql> INSERT INTO child (id) VALUES (101);
# T2需要申请IIL gap lock (90,102), 发现T1的gap lock没有释放,所以blocked...
sql语句加锁
唯⼀索引等值查询:
非唯⼀索引等值查询:
对应的查询结果example:
# T1
begin; select * from t where id = 10 for update;
41 / 52
notes-图解mysql.md 4/29/2022
其他事务更新id=10 blocked...
# t2
update t set a = 200 where id = 10; # blocked
#====================================================
#====================================================
# T2
begin; select * from t where id = 10 lock in share mode;
# t1
begin; select * from t where id = 11 for update;
# IX, next-key lock (11,15] id=11不存在,退化为gap lock(11,15)
LOCK_TYPE, LOCK_MODE, LOCK_DATA, INDEX_NAME
record, X,GAP 15 PRIMARY
# t2
update t set a = 100 where id = 10; # OK
update t set a = 150 where id = 15; # OK
insert into t values(11,11); # blocked...
42 / 52
notes-图解mysql.md 4/29/2022
sql_safe_updates
默认是0, 如果这个系统变量设置为1的话,意味着update与delete将会受到限制
if set = 0; 在 update 语句的 where 条件没有使⽤索引,就会全表扫描,于是就会对所有记录加上 next-
key 锁(记录锁 + 间隙锁),相当于把整个表锁住了。 会block其他的操作;
1. where + no limit,where条件中必须有索引列;
2. no where + limit;
3. where + limit,where 条件中可以没有索引列;
delete 语句必须满⾜如下条件之⼀才能执⾏成功:
1. where + no limit,where条件中必须有索引列;
2. where + limit,where 条件中可以没有索引列;
update/delete sql_safe_updates总结
select @@global.sql_safe_updates;
select @@session.sql_safe_updates;
# sql_safe_updates默认=0
mysql8> show variables like "sql_safe_updates";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| sql_safe_updates | OFF |
+------------------+-------+
1 row in set (0.01 sec)
43 / 52
notes-图解mysql.md 4/29/2022
幻读 (phantom read)
幻读仅专指“新插入的⾏” new inserted row
RR级别下:
44 / 52
notes-图解mysql.md 4/29/2022
图解3步:
45 / 52
notes-图解mysql.md 4/29/2022
46 / 52
notes-图解mysql.md 4/29/2022
mysql常⽤sql
#show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
#select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 90 |
+-----------------+
#select now();
+---------------------+
| now() |
+---------------------+
| 2020-02-11 08:59:44 |
+---------------------+
#select database();
+------------+
| database() |
+------------+
| test |
+------------+
47 / 52
notes-图解mysql.md 4/29/2022
deadlock
deadlock的4个必要条件
1. mutual exclusive: 互斥
2. hold and wait: 占有且等待
3. no preemption: 不可强占⽤
4. circular wait: 循环等待
只要系统发⽣死锁,这些条件必然成立,但是只要破坏任意⼀个条件就死锁就不会成立。
有两种策略通过「打破循环等待条件」来解除死锁状态:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
48 / 52
notes-图解mysql.md 4/29/2022
master-slave replication(主从复制)
mysql replication 好处:
读写分离
HA ⾼可⽤
⽅便故障切换
架构扩展
49 / 52
notes-图解mysql.md 4/29/2022
mysql master-slave形式
⼀主⼀从(M-S)
⼀主多从(M-SSS)
多主⼀从(MMM-S)
双主复制(M-M)
级联复制(M-S-SSS)
级联复制解决了⼀主多从场景下多个从库复制对主库的压⼒,带来的弊端就是数据同步延迟比较⼤
mysql主从复制原理
3 threads:
binlog format
MySQL 主从复制有三种⽅式:
50 / 52
notes-图解mysql.md 4/29/2022
混合模式复制(mixed-based replication,MBR)
对应的binlog文件的格式也有三种:STATEMENT,ROW,MIXED。
mysql binlog主从复制
async 异步: commit之后立⻢return给user; 不需要等待slave节点是否已经同步完成; (默认mode, 性能好,
但是slave可能数据不完整)
semi-sync 半同步: commit之后,⾄少同步binlog给⼀个slave节点并保存为relay-log就可以return给user;
(介于2者之间)
full-sync 全同步: commit之后,同步binlog给所有的slave并执⾏sql成功之后return给user; (性能最差,
slave数据完整)
mysql>change master to
master_host='192.168.199.117',
master_user='slave',
51 / 52
notes-图解mysql.md 4/29/2022
master_port=7000,
master_password='slavepass',
master_log_file='mysql-bin.000008',
master_log_pos=0;
mysql>start slave;
mysql>show slave status\G;
mysql新⼀代主从复制-GTID
GTID = server_uuid:transaction_id
vim my.cfg
#GTID:
gtid_mode = on
read_only = on
# slave
mysql> change master to
master_host='172.23.3.66',master_user='slave1',master_password='123456',master_aut
o_position=1;
Query OK, 0 rows affected, 2 warnings (0.26 sec)
Ref
1. mysql doc
2. mysql explain
3. mysql explain
4. mysql MVCC
5. mysql innodb next-key lock
52 / 52