MYSQL高级

MySql 高级

1、frm文件: 存储表结构
2、myd文件: 存储表数据
3、myi文件: 存储表索引
select * from user where name='' and email='';

create index idx_user_name on user(name);
create index idx_user_nameEmail on user(name,email);
sql执行顺序:

​ 1、手写:

SELECT DISTINCT
	<select_list>
FROM
	<left_table><join_type>
JOIN	<right_table> 
ON 		<join_conditition>
WHERE
	<where_condition>
GROUP BY
	<group_by_list>
HAVING
	<having_condition>
ORDER BY
	<order_by_condition>
LIMIT <limit_number>

​ 2、机读

FROM <left_table>
ON 	<join_conditition>
<join_type>  JOIN	<right_table> 
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
7种join
1select * from tbl_emp a inner join tbl_dept b on a.deptId = b.id;
2、selct * from tbl_emp a left join tbl_dept b on a.deptId = b.id;
3、selct * from tbl_emp a right join tbl_dept b on a.deptId = b.id;
4、slect * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null;
5、slect * from tbl_emp a right join tbl_dept b on a.deptId = b.id where b.id is null;
6、slect * from tbl_emp a left join tbl_dept b on a.deptId = b.id
union
slect * from tbl_emp a right join tbl_dept b on a.deptId = b.id ;
7、slect * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null
union
slect * from tbl_emp a right join tbl_dept b on a.deptId = b.id where b.id is null;
哪些情况需要创建索引:

​ 1、主键自动建立唯一索引

​ 2、频繁作为查询条件的字段应该创建索引

​ 3、查询中与其他表关联的字段,外键关系建立索引

​ 4、单键/组合索引的选择问题,who(在高并发下倾向创建组合索引)

​ 5、查询中排序的字段,排序的字段若通过索引去访问大大提高排序速度

​ 6、查询中统计或者分组的字段

哪些情况不需要建立索引:

​ 1、表记录太少

​ 2、经常增删改的表

		原因:Why:提高了查询速度,同时却会降低更新表的速度,如对表进行INSERTUPDATEDELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

​ 3、where条件里面用不到的的字段不创建索引。

​ 4、数据重复并且分布平均的表字段,因此只为最近常查询和最经常排序的数据列建立索引,注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。

explain + SQL语句
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra

​ id 相同的时候,执行顺序是由上到下的;如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行;id如果相同,可以认为是一组,从上往下顺序执行,在所有的组中,id值越大,优先级越高,越先执行。

DERIVED=衍生。

​ type 有 ALL index range ref eq_ref const,system NULL

​ 从最好到最差依次是:

system > const > eq_ref > ref > range > index > ALL

​ **possible_keys 和 keys ** 决定:

​ 1:是否使用到了索引,判断索引是否失效。

​ 2:在多个索引竞争的时候,mysql到底用到了哪个索引。

key_length:

​ 在查询结果一致的情况下,精度越小越好。

ref:

​ 显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值

rows:

​ 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

Extra:

​ 包含不适合在其他列中显示但十分重要的额外信息。

​ Using filesort(九死一生):说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序 ”。

​ Using temporery(十死无生):使用了临时表保存中间结果,MYSQL在对查询结果排序的时候使用了临时表,常见于排序order by和分组group by。

​ Using index(表现不错):表示相应的select操作中使用了覆盖索引,避免了访问表的数据行,效率不错!如果同时出现Using where 表明索引被用来执行索引键值的查找;如果没有出现Using where,表明索引用来读取数据而非查找动作。

CREATE TABLE IF NOT EXISTS `article`(
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT(10) unsigned not null,
`category_id` int(10) unsigned not null,
`views` int(10) unsigned not null,
`comments` int(10) unsigned not null,
`title` varbinary(255) not null,
`content` text not null    
);

insert into `article`(`author_id`,`category_id`,`views`,`comments`,`title`,`content`) values(1,1,1,1,'1','1'),(2,2,2,2,'2','2'),(1,1,3,3,'3','3');

select * from article;

create table if not exists `class`(
`id` int(10) unsigned not null auto_increment,
`card` int(10) unsigned not null,
primary key(`id`)
);
create table if not exists `book`(
`bookid` int(10) unsigned not null auto_increment,
`card` int(10) unsigned not null,
primary key(`bookid`)
);

insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));


insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));

create table if not exists `phone`(
`phoneid` int(10) unsigned not null auto_increment,
`card` int(10) unsigned not null,
primary key(`phoneid`) 
)engine=innodb;

insert into phone(card) value(floor(1+(rand()*20)));
insert into phone(card) value(floor(1+(rand()*20)));


explain select * from class left join book on class.card = book.card left join phone on book.card = phone.card;
一张表:

建立索引的时候,在where条件后的字段【where comments > 1】不适合做索引。

两张表:

左连接的时候在右边表上加索引,右连接的时候在左边表上加索引。

记法:左连接的时候是左表的数据都有,我们要关心右表,所以我们要在右表上建立索引。

三张表:

左连接为例:三张表左连接,依次给右边表建立索引。

explain select * from class left join book on class.card = book.card left join phone on book.card = phone.card;

 create index Y on book(card);
 create index Z on phone(card);
结论:
1、尽可能减少join语句中的NestedKoop(嵌套循环)的循环总次数:“永远用小结果集驱动大的结果集”。
2、优先优化嵌套循环的内层循环。
3、保证Join语句中被驱动表上Join条件字段已经被索引。
4、当无法保证驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝啬JoinBuffer的设置。
索引失效:
create table staffs(
id int primary key auto_increment,
name varchar(24) not null default '' comment '姓名',
age int not null default 0 comment '年龄',
pos varchar(20) not null default '' comment '职位',
add_time timestamp not null default current_timestamp comment '入职时间'
)charset utf8 comment '员工记录表';

insert into staffs(name,age,pos,add_time) values('z3',22,'manager',now());
insert into staffs(name,age,pos,add_time) values('July',23,'dev',now());
insert into staffs(name,age,pos,add_time) values('2000',23,'dev',now());

alter table staffs add index index_staffs_nameAgePos(name,age,pos);


create table `tbl_user`(
`id` int(11) not null auto_increment,
`name` varchar(20) default null,
`age` int(11) default null,
`email` varchar(20) default null,
primary key(`id`)
)engine=innodb auto_increment=1 default charset=utf8;

insert into tbl_user(name,age,email) values('1aa1',21,'b@163.com');
insert into tbl_user(name,age,email) values('2aa2',222,'a@163.com');
insert into tbl_user(name,age,email) values('3aa3',256,'c@163.com');
insert into tbl_user(name,age,email) values('4aa4',21,'d@163.com');

explain select name,age from tbl_user where name like '%aa%';

索引失效的各种原因:

1、全值匹配我最爱

​ 2、最佳左前缀法则

查询从索引的最左前列开始并且不跳过索引中的列带头大哥不能死,中间兄弟不能断

​ 3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描I

​ 4.存储引擎不能使用索引中范围条件右边的列。范围之后全失效

​ 5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列-致)),减少select*。

​ 6.mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。

  1. is null ,is not null也无法使用索引
  2. ike以通配符开头(%b…mysq索引失效会变成全表扫描的操作一问题: 解决ike %字符串%时索引不被使用的方法? ? like 百分加右边。 两边百分号解决方案:使用覆盖索引,要查询的字段和建立的索引在名字、个数、顺序最好完全一致。
  3. 字符串不加单引号索引失效。

10.少用or,用它来连接时会索引失效园。

查询截取分析

​ ------分析------

​ 1、观察,至少跑一天,看看那生产的慢sql的情况。

​ 2、开启慢查询日志,设置阈值,比如超过5秒的慢sql,并将它抓取出来。

​ 3、explain + 慢sql分析。

​ 4、 show profile。

​ 5、运维经理或者是DBA,进行SQL数据库服务器的参数调优。

==总结

​ 1、慢查询的开启并捕获。

​ 2、explain + 慢SQL分析。

​ 3、show profile 查询SQL在mysql服务器里面执行细节的生命周期情况。

​ 4、SQL数据库服务器的参数调优。

查询优化

1、永远小表驱动大表。小的数据集驱动大的数据集。
当B表的数据集小于A表的数据集的时候使用 in
select  * from A where id in (select id from B)
等价于:
for select id from B
for select * from A where A.id = B.id

当A的数据集小于B表的时候使用 exists
select * from A where exists(select 1 from B where B.id = A,id)
等价于:
for select * from A
for select * from B where B.id = A.id

exists 语法可以理解为:
将主查询的数据,放到子查询中做条件验证,根据验证的结果(TRUE或者是FALSE)来决定主查询的数据结果是否得以保留
2、order by关键字的优化

​ 1、order by 尽量使用index方式排序,避免使用FileSort方式排序。

create table tblA(
age int,
birth timestamp not null
);

insert into tblA(age,birth) values(22,NOW());
insert into tblA(age,birth) values(23,NOW());
insert into tblA(age,birth) values(24,NOW());

create index idx_tblA_ageBirth on tblA(age,birth);

select * from tblA;

MySQL 支持两种方式的排序,FileSort和Index,Index效率高,它指MySQL扫描本身完成排序。FileSort方式效率低。

为排序使用索引
MySq|两种排序方式:文件排序或扫描有序索引排序
MySql能为排序与查询使用相同的索引
(KEY a_b_c a,b,c)
order by能使用素引最左前魔
- ORDERBY a .
- ORDER BY a.b
- ORDERBYa b.c
- ORDER BY a DESC b DESC, c DESC
如果WHERE使用素引的最左前覆定义为常量。则order by能使用素引
- WHERE a const ORDER BY b,c
- WHERE a = const AND b = const ORDER BY c
- WHERE a = const ORDER BY b,c
- WHERE a = const AND b > const ORDER BY b, c 
不能使用索引进行排序
- ORDER BY aASC, b DESC, c DESC /*排序不一致*/
-WHERE g=const ORDER BY b,c /*丢失a素引*/
- WHERE a = const ORDER BY c /*丢失b索引*/
- WHERE a = const ORDER BY a, d  /*d不是索引的一部分*/
-WHERE a in (J ORDER BY b,c /*对于排序来说多个相等条件也是范围查询/

3、group by关键字的优化

​ 1、group by 实质是先排序后分组,遵照索引建的最佳左前缀

​ 2、当无法使用索引列的时候,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置

​ 3、where 高于having,能写在where限定的条件下就不要去having限定了。

慢查询日志

​ MySQL默认不开启,如果不是调优需要,尽量不要开启,或多或少的会影响性能。

​ 查看是否开启以及如何开启

默认:
SHOW VARIABLES LIKE '%slow_query_log%';
开启:
set global slow_query_log=1;

临时开启,下次开启会自动关闭。

一直开启需要修改配置文件 my.cnf

slow_query_log=1
slow_query_log_file/var/lib/mysql/localhost-slow.log

什么样的sql会被记录为慢SQL?
这个由long_query_time控制,默认情况下long_query_time的值为10秒,
命令为:
show variables like 'long_query_time%';
判断条件为 大于  不是大于等于。

设置慢的阈值时间:
set global long_query_time=3;
设置以后看不到变化?
原因:
1、需要重新连接或断开一个会话才能看到修改值。show variables like 'long_query_time%';
2、show global variables like 'long_query_time%';

查看慢日志里面的慢SQL的条数。
show global status like '%Slow_queries%';
批量数据
1.建表
create table dept(
id int unsigned primary key auto_increment,
deptno mediumint unsigned not null default 0,
dname varchar(20) not null default "",
loc varchar(13) not null default ""
)engine=innodb default charset=gbk;

create table emp(
id int unsigned not null default 0,
empno mediumint unsigned not null default 0,
ename varchar(20) not null default "",
job varchar(9) not null default "",
mgr mediumint unsigned not null default 0,
hiredate date not null,
sal decimal(7,2) not null,
comm decimal(7,2) not null,
deptno mediumint unsigned not null default 0
)engine=innodb default charset=gbk;
2.设置参数log_bin_trust_function_creators
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=1;
3.创建函数,保证每条数据都不同。

​ a、随机产生字符串

DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
 DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
 DECLARE return_str VARCHAR(255) DEFAULT '' ;
 DECLARE i INT DEFAULT 0;
 WHILE i < n DO
 SET return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
 SET i = i + 1;
 END WHILE;
 RETURN return_str;                      
END $$

​ b、随机产生部门编号

DELIMITER $$
CREATE FUNCTION rand_num() RETURNS INT(5)
BEGIN
 DECLARE i INT DEFAULT 0;
 SET i = FLOOR(100+RAND()*10);
RETURN i;
END $$

#假如要删除
drop function rand_num;
4.创建存储过程。

​ a.往emp表插入数据的存储过程。

DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocqmmit =0把autocommit设置成0
 SET autocommit= 0;
 REPEAT
 SET i=i+ 1;
 INSERT INTO emp (empno, ename, job ,mgr ,hiredate ,sal ,comm ,deptno ) VALUES ((START+i),rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
 UNTIL i= max_num
 END REPEAT;
 COMMIT;
 END $$

​ b.往dept表中插入数据的存储过程。

DELIMITER $$
CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocqmmit =0把autocommit设置成0
 SET autocommit= 0;
 REPEAT
 SET i=i+ 1;
 INSERT INTO dept (deptno, dname, loc) VALUES ((START+i),rand_string(10),rand_string(8));
 UNTIL i= max_num
 END REPEAT;
 COMMIT;
 END $$
5.调用存储过程。
DELIMITER ;
CALL insert_dept(100,10);

DELIMITER ;
CALL insert_emp(100001,500000);
Show Profile 分析步骤

​ 1、是否支持,看看当前mysql版本是否支持。

show variables like 'profiling';

​ 2、开启功能,默认是关闭,使用前需要开启。

set profiling = on;

​ 3、运行sql。

select * from tbl_emp;
select * from tbl_emp e inner join tbl_dept d on e.deptId = d.id;

select * from emp group by id%10 limit 150000;
select * from emp group by id%20 order by 5;

​ 4、查看结果,show profiles;

​ 5、诊断SQL,show profile cpu,block io for query 上一步前面的问题数字号码;

show profile cpu,block io for query 7;

​ 6、日常开发需要注意的结论。

 converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬
 Creating tmp table 创建临时表(拷贝数据到临时表,用完在删除)
 Copying to tmp table on disk 把内存中的临时表复制到磁盘,危险!!!
 locked
全局查询日志

​ 1、命令。

set global general_log=1;
set global log_output='TABLE';

此后,你所编写的sql语句,将会记录到mysql库里的general_log表,可以用下面的命令查看
select * from mysql.general_log;

​ 2、永远不要在生产环境中使用这个功能。

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当前写操作没有完成之前,它会阻断其他写锁和读锁。
表锁
行锁
表锁(偏读)MyIsm存储引擎
create table mylock(
id int not null primary key auto_increment,
name varchar(20)
)engine myisam;

insert into mylock(name) values('a');
insert into mylock(name) values('b');
insert into mylock(name) values('c');
insert into mylock(name) values('d');
insert into mylock(name) values('e');

select * from mylock;

手动增加表锁
lock table 表名字 read(write), 表名字2 read(write), 其它;

查看表上加过的锁
show open tables;

释放表锁
unlock tables;

show status like 'table%';

Table_locks_immediate: 产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1 ;
Table_locks_waited: 出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况;

此外,Myisam的读写锁调度是写优先,这也是myisam不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。
读锁(排它锁)
lock table mylock read;
session_1(mylock加读锁)session_2
当前session可以查询锁表记录其他session也可以查询锁表
当前session不能查询其他没有加锁的表
因为你这里还锁着一张表不能进行操作其他表
其他session可以查询其他没有加锁的表
也可以更新其他没有锁定的表
当前session插入或者更新锁定的表都会提示报错当前session插入或者更新锁定的表一直等待获得锁
锁释放了以后session2获得锁,完成插入或者修改的的操作。
写锁(独占锁)
lock table mylock write;
session_1(mylock加写锁)session_2
当前session可以查询锁表记录其他session查询锁表会阻塞
当前session不能查询其他没有加锁的表
因为你这里还锁着一张表不能进行操作其他表
其他session可以查询其他没有加锁的表
也可以更新其他没有锁定的表
当前session插入或者更新锁定的表会成功当前session插入或者更新锁定的表一直等待获得锁
锁释放了以后session2获得锁,完成查询或者插入或者修改的的操作。

结论:读锁会阻塞写,但是不会阻塞读。写锁会阻塞读和写

行锁(偏写)InnoDB存储引擎

事物ACID【原子性、一致性、隔离性、持久性】
更新丢失:程序员A和程序员B同时进行修改文件,程序员B修改了程序员A修改之后的文件,覆盖了程序员A的操作。
脏读:事务A读取到了事务B已修改但尚未提交的数据,
不可重复读:一个事务在前后两次读取的结果不一样。事物A读取到了事物B提交的修改数据,不符合隔离性。
幻读:事务A读取到了事务B提交的新增的数据,不符合隔离性。
脏读是事务B里面修改的数据。
幻读是事务B里面新增了数据。

事物的隔离级别:
1、读未提交
2、读已提交
3、可重复读
4、可序列化

查看mysql的默认事物隔离级别: 
show variables like 'tx_isolation'; 可重复读
隔离级别数据一致性脏读不可重复读幻读
未提交读
(Read uncommitted)
最低级别,只能保证不读取物理上损坏的数据
已提交读
(Read committed)
语句级
可重复读
(Repatables read)
事物级
可序列化
(Serializable)
最高级别,事物级
行锁示例:
create table test_innodb_lock (a int(11),b varchar(16))engine=innodb;

insert into test_innodb_lock values(1,'b2');
insert into test_innodb_lock values(3,'3');
insert into test_innodb_lock values(4,'4000');
insert into test_innodb_lock values(5,'5000');
insert into test_innodb_lock values(6,'6000');
insert into test_innodb_lock values(7,'7000');
insert into test_innodb_lock values(8,'8000');
insert into test_innodb_lock values(9,'9000');
insert into test_innodb_lock values(1,'b1');

create index text_innodb_a_ind on test_innodb_lock(a);
create index text_innodb_b_ind on test_innodb_lock(b);

select * from test_innodb_lock;

session_1session_2
set autocommit=0;set autocommit=0;
更新不提交,没有手写commit;session_2 被阻塞,只能等待
提交更新解除阻塞更新正常进行
执行commit命令
下面试试1号会话更新a=1下面试试2号会话更新a=3
相互不影响因为是行锁相互不影响因为是行锁

无索引行锁升级为表锁。

例子:修改数据的时候varchar的类型没有加单引号,就直接运行,由于mysql底层的自动转换功能,所以sql语句可以正常执行,但是会将行锁升级为表锁,而且自己也不知道,危险。

间隙锁的危害:

什么是间隙锁:当我们用范围条件而不是相等条件检索数据,并请求共享或者排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内但是并不存在的记录,就叫“间隙”;

危害:间隙锁有一个比较致命的危害,就是当锁定一个范围的键值之后,即使这个键值并不存在也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据,在某些场景下这可能造成很大的危害。

面试:常考如何锁定一行
锁定test_innodb_lock表的第8行。
第一步:
	begin
第二步:
	select * from test_innodb_lock where a=8 for update;
第三步:
	commit;
分析行锁标签
show status like 'innodb_row_lock%';


Innodb_row_lock_current_waits:当前正在等待锁定的数量 
Innodb_row_lock_time:从系统启动到现在锁定时间长度
Innodb_row_lock_time_avg:每次等待所花平均时间
Innodb_row_lock_time_max:从系统启动到现在等待时间最长的一次所花的时间
Innodb_row_lock_waits:系统启动后到现在总共等待的次数

优化建议

1、尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。
2、合理设计索引,尽量缩小锁的范围。
3、可能减少索引条件,避免间隙锁。
4、尽量控制事物大下,减少锁定资源量和时间长度。
5、尽可能低级别事物隔离。

页锁:知道有这么一个东西就好了。

主从复制

原理:

​ 1、master 将改变记录到二进制文件(binary log),这些记录过程叫做二进制文件,binary log events;

​ 2、slaver将master的binary log events 拷贝到它的中继日志(relay log);

​ 3、slave重做中继日志中的事件,将改变应用到自己的数据库中,MySQL复制是异步的且串行化的。

一从一主(window作为主机,linux作为从机)

windows的配置文件为my.ini linux的配置文件为 my.cnf mysql的版本一致且后台以服务运行

步骤:

windows主机配置:

[必须]windows上的作为主机,所以要配置一个
		server.id=1
[必须]因为主从机之间是传输二进制文件,所以要请用二进制文件:
		log-bin=自己的本地路径/mysqlbin
		log-bin=D:/devSoft/MySQLServer5.5/data/mysqlbin
[可选]启用错误日志
		log-err=自己本地的路径/data/mysqlerr
		log-err=D:/devSoft/MySQLServer5.5/data/mysqlerr
[可选]根目录
		basedir="自己本地路径"
		basedir="D:/devSoft/MySQLServer5.5/"
[可选]临时目录
		tmpdir="自己本地路径"
		tmpdir="D:/devSoft/MySQLServer5.5/"
[可选]数据目录
		dadatadir="D:/devSoft/MySQLServer5.5/Data/"
		datadir="自己本地路径/Data/"
配置主机的读写都可以支持
		read-only=0
[可选]设置不要复制的数据库
		binlog-ignore-db=mysql
[可选]设置需要复制的数据库
		binlog-do-db=需要复制的主数据库名字

Linux从机配置

启用二进制文件[本来就有,不用配置]
		log-bin=mysql-bin
因为是从机,所以要配置server.id
		server.id=2

配置之后重启mysql服务 service mysql restart

主从机要关闭防火墙 service ipables stop

因为是一主一从,主机windows需要给linux授权(slave)所以:

GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'从机器数据库IP' IDENTIFIED BY '123456';

授权之后要刷新一下,所以:

flush privileges;

主机设置完成,要查看主机的状态,因为从机要跟随主机,有些参数需要知道,所以:

show master status;

记录File和Position的值
File:表示从机要拷贝的二进制文件
Position:文件所在磁盘的位置

之后从机需要知道自己要复制哪台主机,所以:

CHANGE MASTER TO MASTER_HOST='192.168.124.3',
MASTER_USER='zhangsan',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysqlbin.具体数字',MASTER_LOG_POS=具体值;

这里用到上面记录的File的二进制文件值 和 二进制文件位置的具体值

之后启动从机,所以:

start slave;

启动之后查看从机的状态,所以:

show slave status\G;

需要 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 才可以

之后就可以在主机上进行操作了,所以:

#建库
create database mydb01;
#使用库
use mydb01;
#建表
create table dog (id int(10) not null,name varchar(20));
#插入数据
insert into dog values(1,'ww1');
#查询数据
select * from dog;

之后就可以在从机上面进行测试了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值