MySQL-(基础)

1.下载简介

官方网站www.mysql.com
· 安装方式:
1、源码安装(tar.gz)
2、二进制安装
3、yum(rpm包)
版本选择潜规则:
Mysql5.6: GA(稳定版)6-12个月,小版本是偶数版
Mysql5.7:GA(稳定版)6-12个月,小版本是偶数版,选择Mysql5.7.17以上版本(MGR)

image.png

image.png

image.png

  • 源码包下载(速度慢)
image.png
  • 二进制下载(推荐企业中)
image.png

2.安装部署

  • MySQL源码安装
#上传或下载源码包,并解压
[root@mysql-db01 ~]# tar xf mysql-5.6.46.tar.gz
# 安装依赖
[root@mysql-db01 ~]# yum install -y cmake openssl-devel gcc gcc-c++ glibc ncurses-devel autoconf libaio-devel
[root@mysql-db01 ~]# cd mysql-5.6.46/
[root@mysql-db01 ~/mysql-5.6.46]# mkdir /application
#编译(每次重新编译需要删除CMakeCache.txt)
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.46 \
-DMYSQL_DATADIR=/application/mysql-5.6.46/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.46/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
#如果失败可以尝试修改为-DWITH_SSL=system \ (5.6.46之前用system.5.6.6之后可以使用bundled)
# 编译
[root@mysql-db01 ~/mysql-5.6.46]# make
#安装
[root@mysql-db01 ~/mysql-5.6.46]# make install
#创建用户
useradd mysql -s /sbin/nologin -m
#创建软链接
ln -s /application/mysql-5.6.46 /application/mysql
#拷贝配置文件
[root@mysql-db01 /application/mysql]# cd support-files/
[root@mysql-db01 support-files]# cp my-default.cnf /etc/my.cnf
#拷贝启动脚本
[root@mysql-db01 support-files]# cp mysql.server /etc/init.d/mysqld
#初始化
[root@mysql-db01 /application/mysql/support-files]# cd ..
[root@mysql-db01 /application/mysql]# cd scripts/
[root@mysql-db01 scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data
#创建socket文件存放目录
[root@mysql-db01 mysql]# mkdir /application/mysql-5.6.46/tmp
#更改权限
chown -R mysql.mysql /application/mysql*
#启动测试
/etc/init.d/mysqld start
#添加环境变量
vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"
#加载环境变量
source /etc/profile
  • 二进制安装MySQL
#安装依赖
[root@mysql-db02 ~]# yum install -y cmake openssl-devel gcc gcc-c++ glibc ncurses-devel autoconf libaio-devel
# 上传安装包并解压
[root@mysql-db02 ~]# tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz 
[root@mysql-db02 ~]# mkdir /application
[root@mysql-db02 ~]# mv mysql-5.6.46-linux-glibc2.12-x86_64 /application/mysql-5.6.46
# 拷贝配置文件
[root@mysql-db02 /application/mysql-5.6.46/support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y
# 拷贝启动脚本
root@mysql-db02 /application/mysql-5.6.46/support-files]# cp mysql.server /etc/init.d/mysqld
# 创建MySQL用户并制作软链接
[root@mysql-db02 /application/mysql-5.6.46/support-files]# useradd mysql -s /sbin/nologin -M
[root@mysql-db02 /application]# ln -s mysql-5.6.46 mysql
# 初始化MySQL
[root@mysql-db02 /application/mysql/scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data
#授权
[root@mysql-db01 mysql]# chown -R mysql.mysql /application/mysql*
#添加环境变量
[root@mysql-db01 mysql]# vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"
#加载环境变量
[root@mysql-db01 mysql]# source /etc/profile
#替换路径
[root@mysql-db02 scripts]# sed -i 's#/usr/local#/application#g' /etc/init.d/mysqld
#启动MySQL
[root@mysql-db02 /application/mysql]# service mysqld start
#登录测试
[root@mysql-db06 /application/mysql/scripts]# mysql
#添加初始密码
mysqladmin password 123

3.使用systemctl 管理MySQL

  • 源码安装的MySQL
#编写配置文件
[root@mysql-db01 ~]# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf    #ExecStart需修改mysql实时的存在路径
LimitNOFILE = 5000
  • 二进制安装的MySQL

避坑:二进制安装与编译安装不同。
编译安装的使用已经根据我们自定义下,所有程序去定义的目录下载找文件。

二进制安装,由于是官方已经编译好的。所有默认所有程序去/usr/local 下找MySQL的文件和目录

[root@mysql-db02 ~]# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

# 需修改配置文件(告诉所有软件mysql的文件和数据地址)
[root@mysql-db02 ~]# vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data

4.数据管理系统的种类

关系型数据库(RDBMS)
特点:二维表、通过SQL存、取结构化语言、数据安全性能强
典型产品:MySQL、Orecle、MSSQL(sqlserver)
非关系型数据库(NoSQL)
特点:json格式、做关系型数据库的性能补充、高并发、灵活性、管理不适应SQL管理
典型产品:Redis、MongDB、Mencache、Elasticsearch(es)搜索引擎式的数据库
功能性能对比:


image.png

5.客户端的连接方式

1.TCP/IP 连接
mysql -uroot -p123 -h127.0.0.1
mysql -uroot -p123 -h10.0.0.53 -S /tmp/mysql.sock
2.socket 连接
mysql -uroot -p123 -S /application/mysql/tmp/mysql.sock
mysql -uroot -p123 -hlocalhost
mysql -uroot -p123
总结:
1、不是所有的 -h 一定是TCP连接,只有- h 后面接IP地址才是TCP
2、当 -h 和 -S 同时出现时,一定走 -h
3、MySQL默认连接方式socket连接
问题:
为什么MySQL默认连接是socket连接?

答:TCP连接,需要建立三次握手,速度比socket慢,所以M有SQL默认使用socket连接。

6.MySQL服务器的构成

什么是实例?
实例是由 进程 + 多个线程 + 预分配的内存结构组成
预分配内存: M有SQL默认是128M
企业中,MySQL内存分配:物理内存的70% ~ 80%

#查看MySQL的预分配内存
root@mysql-db01 ~]# mysqladmin variables |grep innodb_buffer_pool_size
| innodb_buffer_pool_size                                | 134217728                                                                                                                                                                                                                                                                                                                                        |
#MySQL内部查看命令
mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

7.MySQL程序结构

image.png
#连接层:
1.验证用户的合法性(用户名,密码,黑名单,白名单,权限)

2.提供两种连接方式(TCP/IP , socket)

3.提供一个与SQL层交互的线程
#SQL层(按照顺序执行)
1.接收连接层传来的SQL语句

2.检测语法(syntax)

3.检测语义(这条SQL语句属于:DDL,DML,DCL,DQL,DTL)

这条语句,它是show语句 还是 create语句 还是 select 语句  还是 insert update  delete ...

4.解析器,将判断语义后的SQL语句,进行解析,生成多种执行计划。

5.优化器,将解析器生成的多种执行计划,选择最优,速度最快的一条。

6.执行器,将优化器选择的最优的方式,执行(执行SQL语句)

- 提供一个与存储引擎层交互的线程,将SQL语句交给存储引擎层,去磁盘上拿数据
- 接收存储引擎层,返回的结构化成表的数据

7.写缓存(如果前端有缓存则写,没有缓存则不写)

8.记录日志,(binlog:如果开启了binlog则记录,不开启则不记录)
#存储引擎层
1.接收SQL层传来的SQL语句

2.与磁盘交互,去取数据,并结构化成表格的形式,返回给SQL层

3.提供一个与SQL层交互的线程

8.MySQL的结构

1.逻辑结构
  数据库管理员操作的对象
    库
    表:
       真实数据
       元数据:
              列:
                  列名字:
                  约束(非空,主键,非负数,自增,长度)
              其他属性(大小,长度)
2.物理结构
  MySQL的物理结构,就是最底层的数据文件

9.MySQL的单位

段:是由多个区组成,段就是一张表(大小看情况)
区:区是由多个页组成,是由64页组成(大小为1M)
页(块):16k为一个页,最小单位
分区表:就是一个区构成一个段,也就是一张表的表。

10.MySQL用户管理

image.png
  • 用户名@主机域
root@'%'
root@'10.0.0.%'
root@'10.0.0.5%'   10.0.0.50 - 10.0.0.59  + 10.0.0.5
root@'10.0.%.%'      10.0.0~255.0~255
root@'10.%.%.%'
root@'10.0.0.0/255.255.255.0'
  • 修改用户密码的几种方式
#命令行修改
mysqladmin -uwjh -p123 password '***'

#登录到MySQL数据库中修改(MySQL5.6中grant:用户存在时是修改,无此用户则是创建这个用户。MySQL5.7创建用户命令为create!!!)
mysql> grant all on *.* to wjh@'localhost' identified by 'xxx';

#update修改表内容方式
#1.PASSWORD是函数的方式,禁止明文密码
#2.必须接条件where,否则是对所有用户进行操作
#3.注意:update只在修改MySQL用户的密码时,才需要flush privileges 针对全局生效!!!
mysql> update mysql.user set password=PASSWORD('122') where user='wjh' and host='localhost';
flush privileges;

#set方式(只对当前用户的登录密码进行修改)
mysql> set password=PASSWORD('123')

11.MySQL权限管理

INSERT,SELECT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

grant     all privileges    on     *.*        to   wjh@’10.0.0.%’  identified by    ‘123’;
             权限            在   作用对象 给    用户名 @  主机域     密码
             
grant all on *.* to wjh@'10.0.0.%' identified by '123';
grant all privileges on *.* to wjh1@'10.0.0.%' identified by '123';    # 权限为all,和上面一中写法无区别

## 查看用户权限
mysql> show grants for wjh1@'10.0.0.%';
  • 作用对象
*.* : MySQL实例中的所有库和所有表
wordpress.* :MySQL实例中wordpress库下的所有表 [单库级别]
wordpress.user : MySQL实例中,wordpress库下的user表 [单表级别]
#企业常见的用法为单库级别!
  • 最小级别授权(精确控制到列、字段)
grant select on wordpress.user to dev@'10.0.0.51' identified by '123';

#脱敏:脱离敏感信息[MySQL单列级别]
mysql> grant select(user,host) on mysql.user to dev1@'%' identified by '123';    #在mysql库下的user表拥有查询的权限,且只能查看user表中user和host两列内容
  • 权限的增加机制
1、grant select on *.* to wordpress@’10.0.0.5%’ identified by ‘123’;
# 创建一个wordpress@'10.0.0.5%'的用户针对所有库所有表给查询权限,密码是123

2、grant insert,delete,update on wordpress.* to wordpress@’10.0.0.5%’ identified by ‘123’;
# 创建一个wordpress@'10.0.0.5%'的用户针对wordpres库下的所有表给插入,删除,更改权限,密码是123

3、grant all on wordpress.t1 to wordpress@’10.0.0.5%’ identified by ‘123’;
# 创建一个wordpress@'10.0.0.5%'的用户针wordpress库下的t1表给所有权限,密码是123

问题:
1.对t1表的管理能力?    答: 1+2+3 = all 
2.对t2表的管理能力?    答: 1+2=select,inset,update,delete
3.对tb1表的管理能力?   答: 1=selet

# 总结 #
1.授权,如果多个权限,都涉及到某张表,那么权限是相加的。

2.在企业中,不要针对一张表设置多个权限。

3.常用的授权方式:单库级别[wordpress.*]

12.MySQL的连接管理

mysql -uroot -p123                           # 登录数据库
mysqladmin -uroot -p123 password '456'      # 修改密码
mysqldump -uroot -p123 -A > /tmp/full.sql    # 导出数据库内容

mysql
#常用的option
-u:指定用户
-p:指定密码
-h:指定IP
-S:指定socket
-P:指定端口
-e:指定SQL


#第三方连接工具
· navicat
· SQLyog
· 代码的驱动
  • MySQL启动关闭流程


    image.png
#MySQL启动
/etc/init.d/mysqld start
systemctl start mysqld
mysqld_safe --defaults-file=/data/3307/my.cnf &

#MySQL关闭
/etc/init.d/mysqld stop
systemctl stop mysqld
mysqladmin -uroot -p123 shutdown
  • 配置文件读写顺序
1.命令行

2.配置文件

· --defaults-file
· ~/my.cnf
· defaults-extra-file
· $basedir/my.cnf
· /etc/mysql/my.cnf
· /etc/my.cnf  (默认)推荐用法

3.预编译
  • 配置文件的作用
1.影响服务端的启动

[mysqld]      [server]

2.影响客户端的连接

[mysql]       [client]

#总结服务端推荐使用mysqld,因为许多第三方软件默认读取mysqld。填写server会造成报错
#客户:如果服务端上面指定了socket文件的路径,推荐使用client全局生效。防止使用其他MySQL工具时找不到socket的。二进制默认去读取/tmp/socket下。如使用mysql,请将socket的路径也写入
  • MySQL常用命令
status(\s):          #查看MySQL的状态信息
help(\h,?,\?):  #查看mysql客户端命令的帮助信息
exit,quit (\q):#退出mysql终端
clear(\c):#终止当前输入有问题的命令
ego(\G):#格式化显示结果(key:value)
system(\!): #在终端执行系统命令
use(\u): #切换数据库
tee(\T):#记录终端操作日志
source(\.):#导入数据,sql文件

13.MySQL的客户端命令

#设置密码,修改密码
mysqladmin -u用户 -p旧密码 password '新密码'

#停库
mysqladmin -u用户 -p密码 shutdown

#测试MySQL是否存活(多用于监控)
mysqladmin -u用户 -p密码 ping

#库外创建数据库
mysqladmin -uzls -p123 create 库名

#库外删除数据库
mysqladmin -uzls -p123 drop tlbb

#查看MySQL当前实例的配置参数
mysqladmin -uzls -p123 variables

#查看信息
mysqladmin -uzls -p123 status

#刷新binlog
mysqladmin -uzls -p123 flush-log

#重载授权表
mysqladmin -uzls -p123 reload

14.SQL语句

  • DDL:(数据定义语言)
- 针对库:
mysql> help create database;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification] ...

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name
-----------------------------------------------------------------
mysql> create database test_111;    #创建一个test_111的库(database和scheme功能一样,默认采用编译时的字符集)
mysql> create schema test_222;
mysql> create database world charset utf8 collate utf8_general_ci;  #(指定字符集和字符集校验)
mysql> create schema if not exists test_111 charset utf8 collate utf8_general_ci;   #(if not exists 判断库是存在,没有则创建)

# 查看已经创建库的信息
show create database test_111;

# 删
mysql> drop database test_111;
### 外部命令行操作
mysqladmin -uroot -p456 drop test_111;
y
[root@mysql-db02 data]# rm -fr test_111

# 改(字符集)
mysql> alter database test_222 charset gb2312;

#优化默认创建库为utf8,不用每次指定字符集。
mysql> show variables like '%char%';
#将参数写入配置文件服务端下,并重启Mysqld服务
[mysqld]
character_set_server = utf8
[root@mysql-db02 /application]# service mysqld restart

-----------------------------------------------------------------------------------------------------------

- 针对表
#增
## 数据类型
    - 字符串
        - char          (定长)  char(10)    zhang3   张三  10
        - varchar       (变长)    varchar(10) zhang3   张三  2
    - 整型
      - int             (整数)            范围:-2^31 ~ 2^31 -1  (-2147483648  - 2147483647)
      - tinyint     (最小整数)   范围:-128 ~ 127      0-255(需配合unsigned去负符号)
    - 枚举类型
        - enum
    - 时间类型
        - datetime  (日期)        1000  -  9999
        - timestamp (时间戳)       1970  -  2038
        
## 约束
    - 主键:primary key    # 唯一且非空
    - 唯一键:unique key
    - 自增长:auto_increment
    - 非空:not null
    - 无符号:unsigned
    - 默认值:default
    - 注释:comment
    - 补零:zerofill
    - 枚举:enum
    - 取当前时间 NOW()
    ## 枚举:限定值的取值范围,比如性别(男,女,未知)等。
    ## 枚举陷阱:超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;
    
mysql> create table stu5(
id int zerofill primary key auto_increment comment '学号',
name varchar(10) not null comment '学生名',
age tinyint unsigned comment '学生年龄',
gender enum('f','m') not null comment '学生性别',
cometime datetime default NOW() comment '入学时间')charset utf8;

##数据属性解析: 
mysql> create table stu5(
id int zerofill primary key auto_increment comment '学号',
   整数  补零 主键(唯一且非空) 自增(此行必须是:primary key 或 unique key) 注释
name varchar(10) not null comment '学生名',
      变长        非空    注释
age tinyint unsigned comment '学生年龄',
   整数-128~128 非负数 注释   
gender enum('f','m') not null comment '学生性别',
        枚举           非空    注释
cometime datetime default NOW() comment '入学时间')charset utf8;
         时间     默认值  [NOW()取当前时间函数] 注释 字符集

#删
drop table stu2;

#改
## 添加字段
#1.将添加的字段插入最后
mysql> alter table stu2 add donghao int;
#2.将字段插入到第一行
mysql> alter table stu2 add yage char(11) first;
#3.将字段插入到指定字段的后面
mysql> alter table stu2 add sb char(10) after yage;
#4.删除字段
mysql> alter table stu2 drop oldboy;
#5.修改字段名字和属性
mysql> alter table stu2 modify yage varchar(20);    # 修改字段属性
mysql> alter table stu2 change sb somebody int;     # 改变字段名称以及字段属性
#6.修改表名
mysql> alter table stu2 rename stu20;
#7.添加多个字段
mysql> alter table stu20 add oldboy int , add sb char(10);

  • DML:(数据操作语言)
#增
insert
#1.插入单行数据(不规范)
mysql> insert into stu5 values(20,'wang5',99,'m',NOW());
mysql> insert into stu5 values(NULL,'wang5',99,'m',NOW());
#2.插入单行数据(规范)
mysql> insert into stu5(name,age,gender) values('wang5',99,'m');
mysql> insert stu5(name,age,gender) values('wang5',250,'m');
#3.插入多行数据
mysql> insert stu5(name,age,gender) values('wang5',250,'m'),('ma6',38,'f');

#删(忘记delete,使用update代替delete做伪删除)
delete
#删除整个表
mysql> delete from student.sut5;
####重点:一定要接where条件
mysql> delete from student.sut5 where id<10;
mysql> delete from student.stu5 where id >=  <= > <  = <>;

#就算要删除所有表,请加上where条件,习惯
mysql> delete from student.stu5 where 1=1;
#删除同时满足多条件表中内容
delete from student where id>2 and id<5;

#改
update
mysql> update student.stu5 set gender='f';
####重点:一定要接where条件
mysql> update student.stu5 set gender='m' where id=110;

#就算要修改所有表,请加上where条件,习惯
mysql> update student.stu5 set gender='m' where 1=1;

##注意,只有修改数据库用户的时候,才需要flush privileges;
  • 使用update替代delete做伪删除
#1 添加一个状态列
mysql> alter table stu5 add status enum('0','1') default '1' comment '数据状态,存在是1,不存在是0';
#2 使用update删除数据
mysql> update stu5 set status='0' where id=114;
#3查询数据
mysql> select * from stu5 where status='1';

mysql> select * from stu5 where status='1' and name='zhao4';

# 条件查找,找出NULL的行
select * from student where sr !='1000' or sr is null;
select * from student where sbirthday is null;
  • DCL:(数据控制语句)
#grant
grant all on *.* to dev@'%' identified by '123' with grant option;

#允许dev1用户,同时连接的数量
mysql> grant all on *.* to dev1@'%' identified by '123' with max_user_connetions 1;

#限制用户每小时可以查询的次数(登录数据库算一次查询)
mysql> grant select on *.* to dev3@'%' identified by '123' with max_queries_per_hour 2;

#限制用户每小时可以更新的次数
mysql> grant select,update on *.* to dev4@'%' identified by '123' with max_updates_per_hour 1;

#限制用户每小时可以登录的次数
mysql> grant select,update on *.* to dev7@'%' identified by '123' with max_connections_per_hour 1;

#限制用户每小时的查询和更改次数(更改数据必须修改次数和查询次数同时满足才能操作)
mysql> grant select,update on *.* to dev6@'%' identified by '123' with max_queries_per_hour 2 max_updates_per_hour 1;

#revoke(回收权限)
mysql> revoke select on *.* from zls@'%';
  • DQL:(数据查询语句)
###### select的基础用法
#1.查询表中所有的数据(危险,数据大时容易卡死)
mysql> select * from city;
#2.统计函数
mysql> select count(*) from city;
+----------+
| count(*) |
+----------+
|     4079 |
+----------+
#3.步长limit(翻页功能)
mysql> select * from city limit 10;
mysql> select * from city limit 120,60;  #(一页60数据,这里是第二的数据,第三页为180,60 后面以此类推)
#4.查询接条件 where
mysql> select * from city where countrycode='chn' limit 10;
#4.1多条件查询(or  and  in > < = >< >= <=)
mysql> select * from city where population > 4265200 and countrycode='chn';  #and条件都必须满足

mysql> select * from city where countrycode='chn' or countrycode='usa';   (637)      # or 满足其中一个条件即可
mysql> select * from city where countrycode in ('chn','usa');

--- 效率高 ---
mysql> select * from city where countrycode='chn' union all select * from city where countrycode='usa';
#5.排序查询
mysql> select * from city order by id;
mysql> select * from city order by id desc limit 0,60;
#6.模糊查询
mysql> select * from city where countrycode like '%H';      # 模糊匹配H结尾
mysql> select * from city where countrycode like 'H%';      # 模糊匹配H开头
mysql> select * from city where countrycode like '%H%';     # 模糊匹配,包含H的
#7.分组(group by)
## 聚合函数
sum()               #求和
max()               #最大值
min()       #最小值
count()     #统计
avg()       #平均值
distinct()  #去重


#此时此刻,我想吟诗一首
1.遇到统计想函数
2.形容词前groupby
3.函数中央是名词
4.列名select后添加

#统计世界上每个国家的总人口数
sum(population)
group by countrycode
select countrycode,sum(population) from city group by countrycode;

#统计中国各个省的人口数量(练习)
sum(population)
group by district
select district,sum(population) from city where countrycode='chn' group by district;

#统中国各个省的城市数量(练习)
count(name)
group by district
select district,count(name) from city where countrycode='chn' group by district order by count(name);

mysql> select district as 省,count(name) as 城市数量 from city where countrycode='chn' group by district order by count(name);


# 去重计算
select count(class(*)) from t1 where class;
  • DQL:(高级用法连表查询)
# 查询小明的长度
mysql> select people.name,len.lenght from len,people where people.id=len.id and name='小明';
+-----------+--------+
| name      | lenght |
+-----------+--------+
| 小明      |     18 |
+-----------+--------+


# 1.传统连接

#世界上人口数量小于100的城市在哪个国家?
   城市人口数         城市名       国家名

查询的列:city.population,city.name,country.name
等价条件:city.countrycode=country.code and
查询条件:city.population<100;
查询的表:city,country


select city.population,city.name,country.name
from city,country
where city.countrycode=country.code
and city.population<100;


#世界上人口数量小于100的城市在哪个国家说的什么语言?
城市人口数         城市名       国家名        语言
查询的列:city.population,city.name,country.name,countrylanguage.language
查询的表:city,country,countrylanguage
等价条件:city.countrycode=country.code=countrylanguage.countrycode
查询条件:city.population<100;

select city.population as 城市人口数量,city.name as 城市名,country.name as 国家名,countrylanguage.language as 语言
from city,country,countrylanguage
where city.countrycode=country.code and country.code=countrylanguage.countrycode
and city.population<100;

+------------+-----------+----------+-------------+
| population | name      | name     | language    |
+------------+-----------+----------+-------------+
|         42 | Adamstown | Pitcairn | Pitcairnese |
+------------+-----------+----------+-------------+


# 2.自连接 (natural join)
注意:要查询的两个表之间,必须有相同的等价条件(字段名字和数据都相同)

#世界上人口数量小于100的城市的国家代码是什么,说的什么语言?
SELECT city.population as 城市人口数量,city.name as 城市名,city.countrycode as 国家代码,countrylanguage.language as 语言
FROM  city NATURAL  JOIN  countrylanguage 
WHERE population < 100;

# 3.内连接(join on)
#企业常用内连接
#世界上人口数量小于100的城市在哪个国家?
                    城市人口数                            城市名                        国家名
查询的列:city.population as 城市人口数,city.name as 城市名,country.name as 国家名
查询的表:city,country
等价条件:city.countrycode=country.code
查询条件:city.population < 100;

select city.population as 城市人口数,city.name as 城市名,country.name as 国家名
from city join country
on city.countrycode=country.code
where city.population < 100;

注意:建议是 小表在前 大表在后

+-----------------+-----------+-----------+
| 城市人口数      | 城市名    | 国家名      |
+-----------------+-----------+-----------+
|             42 | Adamstown | Pitcairn  |
+----------------+-----------+-----------+


A join B on 1 join C on 2 join D on 3

#世界上人口数量小于100的城市在哪个国家说的什么语言?
城市人口数         城市名       国家名        语言
查询的列:city.population,city.name,country.name,countrylanguage.language
查询的表:city,country,countrylanguage
等价条件:city.countrycode=country.code,country.code=countrylanguage.countrycode
查询条件:city.population<100

select city.population,city.name,country.name,countrylanguage.language
from city
join country
on city.countrycode=country.code
join countrylanguage
on country.code=countrylanguage.countrycode
where city.population<100;

+------------+-----------+----------+-------------+
| population | name      | name     | language    |
+------------+-----------+----------+-------------+
|         42 | Adamstown | Pitcairn | Pitcairnese |
+------------+-----------+----------+-------------+


# 4.外链接
    - 左外连接(left参数:只显示左表内容)

select city.name,city.countrycode,country.name
from city left join country
on city.countrycode=country.code
and city.population<100 limit 10;
+----------------+-------------+------+
| name           | countrycode | name |
+----------------+-------------+------+
| Kabul          | AFG         | NULL |
| Qandahar       | AFG         | NULL |
| Herat          | AFG         | NULL |
| Mazar-e-Sharif | AFG         | NULL |
| Amsterdam      | NLD         | NULL |
| Rotterdam      | NLD         | NULL |
| Haag           | NLD         | NULL |
| Utrecht        | NLD         | NULL |
| Eindhoven      | NLD         | NULL |
| Tilburg        | NLD         | NULL |
+----------------+-------------+------+

    - 右外连接(right参数:只显示右表内容)
select city.name,city.countrycode,country.name
from city right join country
on city.countrycode=country.code
and city.population<100 limit 10;

+------+-------------+----------------------+
| name | countrycode | name                 |
+------+-------------+----------------------+
| NULL | NULL        | Aruba                |
| NULL | NULL        | Afghanistan          |
| NULL | NULL        | Angola               |
| NULL | NULL        | Anguilla             |
| NULL | NULL        | Albania              |
| NULL | NULL        | Andorra              |
| NULL | NULL        | Netherlands Antilles |
| NULL | NULL        | United Arab Emirates |
| NULL | NULL        | Argentina            |
| NULL | NULL        | Armenia              |
+------+-------------+----------------------+

select city.name,country.code,country.name
from city right join country
on city.countrycode=country.code
and city.population<100 limit 10;

+------+------+----------------------+
| name | code | name                 |
+------+------+----------------------+
| NULL | ABW  | Aruba                |
| NULL | AFG  | Afghanistan          |
| NULL | AGO  | Angola               |
| NULL | AIA  | Anguilla             |
| NULL | ALB  | Albania              |
| NULL | AND  | Andorra              |
| NULL | ANT  | Netherlands Antilles |
| NULL | ARE  | United Arab Emirates |
| NULL | ARG  | Argentina            |
| NULL | ARM  | Armenia              |
+------+------+----------------------+



#案例:企业:大型聊天交友平台...
昵称   生日    年龄    性别  身高

微信号   QQ号    手机号  三维



个人基础信息表:t1
t1:昵称   生日    年龄    性别  身高


个人隐私信息表:t2
微信号   QQ号    手机号  三维


select * from 

t1 left join t2

15.字符集

#查看字符集方法
mysql> show charset;

#查看校验规则
mysql> show collation;

mysql> show collation like '%utf8%';

注意:以ci结尾的 严格区分大小写,  cs 和 bin 结尾的对大小写不敏感。
------------------------------------------------------------------------------------------------
- 字符集设置
#1.系统级别设置字符集
#CentOS6:
#永久修改
[root@elkstack02 ~]# vim /etc/sysconfig/i18n
LANG="en_US.UTF-8"
#临时修改
[root@elkstack02 ~]# LANG='en_US.UTF-8'

#CentOS7:
#查看
[root@mysql-db03 ~]# echo $LANG
zh_CN.UTF-8
#临时修改
[root@mysql-db03 ~]# LANG='en_US.UTF-8'
#永久修改
[root@mysql-db03 ~]# vim /etc/locale.conf
LANG="en_US.UTF-8"

#2.终端,xshell  CRT ... 

#3.MySQL实例设置字符集
cmake . 
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \

[root@mysql-db03 ~]# vim /etc/my.cnf
character_set_server=utf8

## 3.1 库级别
mysql> create database zls_zifuji charset utf8;

mysql> alter database zls_zifuji charset gbk;

## 3.2 表级别
mysql> create table zifuji(id int) charset utf8;

mysql> alter table zifuji charset gbk;

-------------------------------------------------------------------------
#字符集案例:企业中,字符集不够用了,gbk 想改成 utf8. 有一万张表,如何修改?
#1.将一万张表的库数据全部导出来
mysqldump -B test_111 > /tmp/test.sql
#2.编辑导出的数据,将所有 的字符集改成utf8(注意:自己创建的库可以采用此方法。危:系统的自带的核心库不能修改!!!)
vim /tmp/test.sql
:%s#gbk#utf8#g
#3.将数据出现导入数据库
mysql < /tmp/test.sql

#注意:在有数据的情况下字符集只支持低级往高级的装换。否则会出问题

16.索引管理及执行计划

1、索引就好比一本书的目录,它能让你更快的找到自己想要的内容。
2、让获取的数据更有目的性,从而提高数据库检索数据的性能。

  • Bterr索引


    image.png
  • B+terr索引


    image.png
  • B*terr索引


    image.png

索引管理
1.索引必须添加在列上面
2.在where后面接上建立索引的列,会加快查询速度
3.pages<---索引(属性)<----查数据。
索引的分类
主键索引(primary key)
普通索引 ***(key)
唯一索引(unique key)

  • 索引的操作
#创建普通索引
mysql> alter table student2 add index idx_sname(sname);
#创建主键索引
mysql> alter table st add primary key pri_id(id);
#创建唯一键索引
mysql> alter table student2 add unique key uni_cometime(cometime);
# 如何判断,该列是否能创建唯一键
#先查一下总数据量
mysql> select count(sgender) from student2;
#再次去重查一下数据量。看是否和第一次一样,如果少则表示该字段存在重复数据
mysql> select count(distinct(sgender)) from student2;

#查看索引
mysql> desc student2;
mysql> show create table student2;
mysql> show index from student2;
  • 前缀索引
#什么是前缀索引?
以某个字段的前n个字符,创建索引
#注意:
1.避免对大列建索引
2.如果有,就使用前缀索引

#删除索引
mysql> alter table student2 drop index idx_sname;

#创建前缀索引
mysql> alter table student2 add index idx_sname2(sname(3));
  • 联合索引
#给多个字段创建一个索引
create table xiangqin( 
id,
name varchar(10), 
age int, money bigint, 
body varchar(10),  
hight int, weight int, 
face varchar(10), 
phone varchar(11), 
sex enum('f','m'));

#创建联合索引
mysql> alter table xiangqin add index idx_all(sex,money,body,face);

insert into xiangqin values('ly',30,999999999,'perfact',158,90,'nice','133','f'),('qbl',58,1000000,'bad',150,150,'very bad','000','f'),('wbq',50,9999999,'suibian',170,120,'suiyi',132,'m');

#查询
走索引
mysql> select * from xiangqin where sex='f' and money>10000000 and body='perfact' and face='nice';

不走索引
mysql> select * from xiangqin where money>10000000 and body='perfact' and face='nice';

mysql> select * from xiangqin where money>10000000 and body='perfact' and face='nice' and sex='f';

alter table xiangqin add index idx_all(a,b,c,d);

select * from xiangqin where a b c d 
                             a b c
                             a b
                             a c(部分走索引)
                             a b d
                             abdc
                             
                             bcd
                             cd
                             bd

#注意:联合索引的主要在于查询的时候,一定要根据创建的时的规则来查询数据!!!

索引创建总结

创建索引:
1.不要在所有字段上都创建索引
2.如果有需求字段比较多,选择联合索引
3.如果有需求字段数据比较大,选择前缀索引
4.如果可以创建唯一索引,一定创建唯一索引

17.explain 用法(查看是否走索引)

#1.全表扫描
mysql> explain select * from student2;

#2.索引扫描
#index      全索引扫描
mysql> explain select sid from student2;

#range      范围查询的时候 会达到range级别
mysql> explain select * from student3 where sid>1;

#ref
mysql> explain select * from city where countrycode='USA' union all select * from city where countrycode='CHN';

#eq_ref
mysql> explain select score.mark,student.sname from score join student on score.sno=student.sno;

#const、system(同级别)
mysql> explain select * from student2 where sid=1;

#null(数据不存在)
mysql> explain select * from student2 where sid=1000000000000000000000000;

一般我们说,只要一条SQL语句,达到range级别,那我们认为,该SQL语句的效率是OK的。

  • Extra(扩展)

Using temporary
Using filesort 使用了默认的文件排序(如果使用了索引,会避免这类排序)
Using join buffer
key_len: 越小越好
前缀索引去控制:rows: 越小越好

建立索引的规范

1.尽量使用唯一索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
注意:如果重复值较多,可以考虑采用联合索引

2.为经常需要排序、分组和联合操作的字段建立索引
例如:
经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。
如果为其建立索引,可以有效地避免排序操作

3.为常作为查询条件的字段建立索引
如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。
因此,为这样的字段建立索引,可以提高整个表的查询速度。

#经常查询
#列值的重复值少
#注:如果经常作为条件的列,重复值特别多,可以建立联合索引

4.尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索
会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

5.限制索引的数目
索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空

6.删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理
员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

如果一个SQL语句,是慢查询

1.有没有创建索引

2.查看数据类型,和查询语句是否一致

3.查询语句中,是否使用字段做运算

4.查询出来的结果集很大,limit

5.查询语句中是否使用<> 或者 not in

6.查询语句中是否使用模糊查询,且%在前面

7.如果使用联合索引,请按照创建索引的顺序查询

8.索引损坏

案例1:用户相关的误操作

  • 误删除所有用户包括root用户(危险语句:truncate mysql.user;清空用户表)

MySQL的用户没有用户数据机制。只是用于登录MySQL。所有我们只需恢复一个超级用户即可。其他用户可再自行创建
方案有2种:
1、查看mysql.user表结构。根据表结构写入一个用户
2、刷新授权表后直接创建的用户


#方法1(插入user表)
#1.停库
[root@mysql-db02 ~]# service mysqld stop
#2.跳过授权表,并禁止远程登录(--skip-grant-tables跳过授权表、--skip-networking禁止远程登录、&后台启动)
[root@mysql-db02 ~]# mysqld_safe --skip-grant-tables --skip-networking &
[root@mysql-db02 ~]# mysql
#2.查看user表结构
mysql> desc mysql.user;
#3.插入字段数据,并授权(MySQL5.6密码字段为Password、MySQL5.7后密码的字段为authentication_string)
insert into mysql.user values ('localhost','root',PASSWORD('123'),
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'',
'',
'',
'',0,0,0,0,'mysql_native_password','','N');
#4.重启并 登录测试
[root@mysql-db02 ~]# service mysqld restart
[root@mysql-db02 ~]# mysql -uroot -p123
----------------------------------------------------------------------------------------------------
#方法2:(跳过授权表的方式)
#1.停库
[root@mysql-db03 ~]# service mysqld stop
#2.跳过授权表登录
[root@mysql-db03 ~]# mysqld_safe --skip-grant-tables --skip-networking &
[root@mysql-db03 ~]# mysql
#3,刷新授权表
mysql> flush privileges;
#4.创建用户,赋予创建用户权限(all默认不包括创建用户权限 with grant option 可创建用户权限)
mysql> grant all on *.* to root@'localhost' identified by '123' with grant option;
#5重启服务,登录测试
[root@mysql-db03 ~]# service  mysqld restart
[root@mysql-db03 ~]# mysql -uroot -p123

案例2: 搭建多实例

当服务器数量受限的时。我们也可以采用多实例的方案搭建(生产不推荐)

#1.多实例数据目录 /application/mysql/data
#2.多个socket
#3.多个配置文件
#4.多个端口
#5.多个错误日志
#6.多个pid文件


#部署:
#1.创建多个目录(存放配置文件)
#[root@mysql-db02 ~]# mysqladmin -uroot -p123 variables |grep socket   可以用这条命令查看,配置写法的规范

[root@mysql-db02 ~]# mkdir /data/330{7,8,9} -p
[root@mysql-db02 ~]# tree /data/
#2.准备多个配置文件
[root@mysql-db02 ~]# vim /data/3307/my.cnf
[mysqld]
basedir = /application/mysql            # 基础目录
datadir = /data/3307/data                # 数据目录
socket = /data/3307/data/mysql.sock    #sock 文件
log_error = /data/3307/data/mysql.err    #错误日志
pid_file = /data/3307/data/mysql.pid    #类似身份标志:pid
log_bin = /data/3307/data/mysql-bin    #开启binlog日志
server_id = 7                      #类似身份标志
port = 3307                          #端口

--------------------
[root@mysql-db02 ~]# vim /data/3308/my.cnf
[mysqld]
basedir = /application/mysql
datadir = /data/3308/data
socket = /data/3308/data/mysql.sock
log_error = /data/3308/data/mysql.err
pid_file = /data/3308/data/mysql.pid
log_bin = /data/3308/data/mysql-bin
server_id = 8
port = 3308

--------------------
[root@mysql-db02 ~]# vim /data/3309/my.cnf
[mysqld]
basedir = /application/mysql
datadir = /data/3309/data
socket = /data/3309/data/mysql.sock
log_error = /data/3309/data/mysql.err
pid_file = /data/3309/data/mysql.pid
log_bin = /data/3309/data/mysql-bin
server_id = 9
port = 3309

[root@mysql-db02 ~]# tree /data/
/data/
├── 3307
│   └── my.cnf
├── 3308
│   └── my.cnf
└── 3309
    └── my.cnf

#3.准备多个数据目录(初始化)
[root@mysql-db02 ~]# cd /application/mysql/scripts/
[root@mysql-db02 /application/mysql/scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3307/data

[root@mysql-db02 /application/mysql/scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3308/data

[root@mysql-db02 /application/mysql/scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3309/data

[root@mysql-db02 /application/mysql/scripts]# tree -L 2 /data/
/data/
├── 3307
│   ├── data
│   └── my.cnf
├── 3308
│   ├── data
│   └── my.cnf
└── 3309
    ├── data
    └── my.cnf

#4.启动多实例(--defaults-file指定配置文件)
[root@mysql-db02 /application/mysql/scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@mysql-db02 /application/mysql/scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@mysql-db02 /application/mysql/scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &

[root@mysql-db02 /application/mysql/scripts]# netstat -lntup |grep 330
tcp6       0      0 :::3307                 :::*                    LISTEN      4617/mysqld         
tcp6       0      0 :::3308                 :::*                    LISTEN      4925/mysqld         
tcp6       0      0 :::3309                 :::*                    LISTEN      5328/mysqld 

#5.设置多实例密码
[root@mysql-db02 /application/mysql/scripts]# mysqladmin -uroot -S /data/3307/data/mysql.sock password '3307'

[root@mysql-db02 /application/mysql/scripts]# mysqladmin -uroot -S /data/3308/data/mysql.sock password '3308'

[root@mysql-db02 /application/mysql/scripts]# mysqladmin -uroot -S /data/3309/data/mysql.sock password '3309'

#6.连接多实例
[root@mysql-db02 /application/mysql/scripts]# mysql -uroot -p3307 -S /data/3307/data/mysql.sock
[root@mysql-db02 /application/mysql/scripts]# mysql -uroot -p3308 -S /data/3308/data/mysql.sock
[root@mysql-db02 /application/mysql/scripts]# mysql -uroot -p3309 -S /data/3309/data/mysql.sock

#7.验证server_id
mysql> show variables like 'server_id'

#8.关闭多实例命令
[root@mysql-db02 /application/mysql/scripts]# mysqladmin -uroot -p3307 -S /data/3307/data/mysql.sock shutdown
[root@mysql-db02 /application/mysql/scripts]# mysqladmin -uroot -p3308 -S /data/3307/data/mysql.sock shutdown
[root@mysql-db02 /application/mysql/scripts]# mysqladmin -uroot -p3309 -S /data/3307/data/mysql.sock shutdown

#9.多实例连接小技巧
[root@mysql-db02 scripts]# vim /usr/local/bin/mysql3307
mysql -uroot -p3307 -S /data/3307/data/mysql.sock

[root@mysql-db02 scripts]# vim /usr/local/bin/mysql3308
mysql -uroot -p3308 -S /data/3308/data/mysql.sock

[root@mysql-db02 scripts]# vim /usr/local/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/data/mysql.sock

# 添加执行权限
[root@mysql-db02 /application/mysql/scripts]# chmod +x /usr/local/bin/mysql330*

#再次连接,可以直接连接
mysql3307
mysql3308
mysql3309

#多实例的启动(加入开机启动)
#MySQL用什么方式启动,就必须用什么方式来关闭!!!例如:service、systemctl
[root@mysql-db02 scripts]# vim /usr/lib/systemd/system/m3307.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf    #需要修改的配置文件目录
LimitNOFILE = 5000


[root@mysql-db02 scripts]# vim /usr/lib/systemd/system/m3308.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000

[root@mysql-db02 scripts]# vim /usr/lib/systemd/system/m3309.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000


[root@mysql-db02 scripts]# systemctl start m3307
[root@mysql-db02 scripts]# systemctl start m3308
[root@mysql-db02 scripts]# systemctl start m3309

[root@mysql-db02 scripts]# systemctl enable m3307
[root@mysql-db02 scripts]# systemctl enable m3308
[root@mysql-db02 scripts]# systemctl enable m3309

案例3:多实例实现主从复制

#主库操作
#1.选择一个多实例作为master
#2.优化用户表,并创建用于主从连接的用户
#3.记录master的binlog以及位置点

#从库操作
#1.检查是否已经开启slave,如果已经开启,需先停止slave再编辑后再次开启
#2.检查是否成功连接到master库
#3.验证server_id
#此时部署已经完成。主库创建新库。从库会自动同步

-------------------------------------------------------------------------------
#部署
选择3306为主库,其他3307、3308、3309 为从
#1.编辑mysql配置文件(主)
vim /etc/my.cnf
#在mysqld标签下配置
[mysqld]
#主库server_id为1,从库不等于1
server_id =1
#开启binlog日志
log-bing=mysql-bin

#2. 登录数据库
msyql -uroot -p123

#3.查询用户表,是否有过优化。
select user,host from mysql.user;
#如果没有优化则优化,此条命令慎用。会清空所有的用户########
truncate mysql.user;

#4.重新创建root用户
grant all on *.* to root@'localhost' identified by '123';

#5.检查用户是否创建成功
mysql> select user,host from mysql.user;
#创建用于主从连接的用户
grant replication slave on *.* to rep@'%' identified by '123';

#6.刷新权限数据表
flush privileges;

#7.记录主库binlog及位置点
show master status;
---------------------------------------------------------------
#登录从库并操作
#8.检查是否已经开启slave,如果已经开启,需先停止slave再编辑后再次开启
 stop slave;
登录msyql
  change master to
     master_host='10.0.0.52',
     master_user='rep',
     master_password='123',
     master_log_file='dysql-bin.000005',
     master_log_pos=120,
     master_port=3306
#9.开启从主
 start slave;
#9.1 如需修改可以一下操作
stop slave
reset slave all

#10.检查是否已经成功连接
 show slave status\G
#11.检查两个yes
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
##12.验证server_id
mysql> show variables like 'server_id';
#13.此时部署已经完成。主库创建新库。从库会自动同步

你可能感兴趣的:(MySQL-(基础))