MYSQL

  国内的数据库:TIDB、人大金仓、达梦

国外的:MySQL,oracle,SQL server,INFOMIX,DB2

数据库的类型:关系型(表的字段之间可以有联系、表和表之间可以有关系):MySQL,oracle,SQL server

非关系型(No-SQL) :redis,mongodb,TIDB,TSDB(一般是key-value型)

安装

1403eb70577a439e878de79ff302027c.png

安装步骤:

官方文档:
https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html

1,去官网下载二进制压缩包

abc3c8187b2d4b13bd87940bc3f2d628.png

二,解压

tar xf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 

2ccbc8b28f704b8abdd502cef2f5f852.png

 319472e9856c4454b5a0581380def633.png

b471a097d3eb4db9adad1060cc0e603e.png

 3,新建存放数据的目录

69203e24062440aa97e0ea89500f9567.png

 4,进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/

5,初始化操作

./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql

638e9c9bb8224356905d9ccbba54a87f.png

 6,让mysql支持ssl方式登录的设置
./mysql_ssl_rsa_setup --datadir=/data/mysql/

7, 修改PATH变量,加入mysql bin目录的路径
#临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
#重新启动linux系统后也生效,永久修改(如果想要在虚拟目录结构中的任何位置执行某个程序,办法是把这个程序所在的目录添加到 PATH 环境变量中)
echo  'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc

e8f2e93661ec4b6baecd6526440c45ae.png

 8,复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp  ../support-files/mysql.server   /etc/init.d/mysqld

9b96f0cf931b49d483af27e91d021116.png

9,修改/etc/init.d/mysqld脚本文件里的datadir目录的值
sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld 

10,#生成/etc/my.cnf配置文件

148e744f26c743269107e0f885255660.png

 之后启动mysqld:service mysqld start

11,将mysqld添加到linux系统里服务管理名单里
/sbin/chkconfig --add mysqld
#设置mysqld服务开机启动
/sbin/chkconfig mysqld on

12,登录验证

mysql -uroot -p'之前说一定要记得的那串文字'

94366f6699774ed7813e695b2b326b17.png

1a8e1ebc25a84271b4953e96da5babd2.png

 c2d2b26389284b3d855bef1c1ac3cb17.png

 4745362ce9b844a399da5d2fcc691439.png8749ddb9e6774a32b896f17fb7f28714.png

一些概念

DBMS(database management system)管理数据的软件;mysql就是一个DBMS 

进程关系

ce6a949f4f3b4d938335b33277308fa0.png

使用pstree命令可以看到mysqld_safe是父进程,mysqld是子进程,当mysqld挂掉后,mysqld_safe会再起mysqld子进程,而当mysqld_safe挂掉后,mysqld仍然能运行,但是再删除mysqld之后 就整个挂掉了,

配置文件的讲解

 mysql的配置文件是/etc/my.cnf

查看mysql里所有的参数:show variables;

[client]代表客户端默认设置内容;

[mysql]代表我们使用mysql命令登录mysql数据库时的默认设置;

[mysqld]代表数据库自身的默认设置;
[client],[mysqld]都是客户端的配置;[mysql]是服务器端配置
[root@wudang-mysql-2 mysql]# cat /etc/my.cnf
[mysqld_safe]
#指定mysqld_safe进程的配置
#需要在mkdir /data/mysql  目录,然后使用命令chown  mysql:mysql  /data/mysql
#因为mysql进程需要往/data/mysql目录里写东西,需要权限,不然不能往目录下写日志
[client]

socket=/data/mysql/mysql.sock

#对客户端的配置
##socket是用来指定socket文件的路径,方便客户端连接找到
[mysqld]
log-error=/data/mysql/mysql.log
#这是指定mysql的日志文件的路径
socket=/data/mysql/mysql.sock
port = 3309
open_files_limit = 8192
innodb_buffer_pool_size = 256M
#mysqld是服务器端的配置
#port 指定端口号
#open_files_limit 指定mysql进程可以打开的文件数量,需要在操作系统里允许进程打开更多的文件
#使用ulimit -n 65535
#innodb_buffer_pool_size 指定缓存池的大小,提升数据性能的参数,最大可以达到物理内存的80%
#破解密码用
#user=mysql
#skip-grant-tables
#指定mysqld的socket文件所在的路径,/data/mysql目录一定要先存在。
#指定mysqld进程的配置
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
#对mysql命令执行的配置
#auto-rehash  支持tab键补齐
#prompt 登录进去后的提示符 
[root@wudang-mysql-2 mysql]# 

socket的分类:

    1.文件socket
        是实现一台电脑里的不同进程之间通信的文件
    [root@wudang-mysql-2 mysql]# mysql -uroot -p'Sanchuang1234#' -S /data/mysql/mysql.sock

在my.cnf配置文件里打开下面的配置,在使用mysql客户端命令连接的时候,就不需要接-S指定socket文件的路径了
    [client]
    socket=/data/mysql/mysql.sock

 mysql -uroot -p'Sanchuang123#' -S /data/mysql/mysql.sock


    2.网络socket

        是ip+port --》格式ip:port   192.168.0.163:3309
        网络中通过ip地址找到对方
        是实现不同的电脑之间的不同的进程之间的通信的
    [root@mysql-2 ~]# mysql  -h 192.168.0.163 -P3309  -ucali -p'Sanchuang1234#' 
        -h 指定主机名(ip)  host
        -P port 端口 (大写)

 mysql -uroot -p'Sanchuang123#' -h 127.0.0.1 -P 3306

mysql的密码破解

 本质上是修改mysql表里的user表中对应的用户的auth_string

步骤:

-----超级用户

1停止mysql进程

service mysqld stop

2修改配置文件(Innodb引擎,将内存中的数据写入磁盘,将磁盘中的数据读入内存)

b9cb3805c5274cdd92346e6c066d7cf4.png

 3刷新服务

service mysqld start

4之后不接密码登录

5刷新权限(会加载原来没有加载的权限表,比如用户名和密码所在的表user等)

flush privileges;

6alter user 'root'@'localhost' identified by '你要重设的密码';

7退出登录,并将之前在/etc/my.cnf中添加的skip-grant-tables行注释掉

再刷新服务

---其他的普通用户

方法1:alter user 'cali'@'%' identified by 'Sanchuang123#'  (cali是你要修改用户的用户名,%表示允许任意IP连接过来)

方法2:set password for 'cali'@'%' identified by '1234567';

mysql中的字符集

 mysql默认字符集是latin1,不支持中文,在/etc/my.cnf中添加character-set-server=utf8来设置服务器字符集为utf8,服务器字符集决定数据库字符集,数据库字符集决定表的字符集,表的字符集决定字段的字符集

查看机器支持的字符集

show character set;

查询你正在使用哪些字符集

show variable like "%character%";

032331cb5ec84289b07438428c8df5b8.png #################

创建一个库本质上就是创建一个文件夹,在你存放数据的地方新建文件夹就是新建一个库,删除也是如此

create database jiacai;--创建数据库jiacai
drop database jiacai--删除数据库jiacai

  ---------建表操作

help create table;--查看建表说明手册

f69f20a81c80406da125f66518cd396b.pngb75006ee0d3c4898baaca622cb68b09c.png

主键:本质上也是一个字段或者多个字段组合而成,不允许出现重复的数据
复合主键:多个字段组成的主键, 

------------根据已有的表建新表

33420a95bdb34da8b7af93d34adb157e.png

-------------alter修改操作

查看alter的使用手册

5709511e53ed4649b5947e5e4b9a21e7.png

向已经建好的Students表中增加一个sex字段

7f89be920cb74bc59b24892330ae0a5b.png

d6b6168653d14c5a831641ec14c9c96a.png

 --------------修改字段名

 6c5927084c01402498fcb1e0afa274ec.png

----删除表

delete--删除表里的数据的时候是一行一行的删除,删除后会产生二进制日志,可以根据日志恢复
truncate--删除数据特别快,整个表锁定表操作然后删除,不会记录二进制日记,不能恢复

febe7f2cb1da420dab560c8ce39a9c12.png

mysql中的数据类型

一、数值类型

length()查询存储空间的大小
char_length()查看字符的长度--》字符的个数

5f42f6a5e8744e619dce164b4fc68e61.png

 二、日期类型

 d0a60b0c60ac4935aa522c726ee22682.png

 三、字符串

char与varchar

5d3bfc4338f14be495db4cc1ab07abcf.png

 5fb5e79109a94b038b676350d2d7adb8.png

时间戳用法:6a52964b8e8843a9972ebbe43fc77c67.pngnow()获取当前时间戳

 d8175defee8749cba54bbeaf18d98080.png

字段属性

not null 不能为空
signed  有符号整数
unsigned  无符号整数
auto_increment  自增
zerofill  拿0去填充

909cd89c99e74439bb2cada97dd6a9d6.png

操作mysql里的变量--使用两个@@符号

9eec374f6f55460b93164e390fc9efd4.png

操作自定义变量

341d8a64b63b4f389afbd31848131de4.png

----

default设置默认值

64a9b0c1e20f41cca97f656edab076cc.pngfc454bfc61404076ba4c7a4f421ee7e4.png

 ----comment给表加注释

 ee80990d8ab047f4868094d2ffd1d496.png

 96a1ecfa9357422c964b72ad521927ec.png

  

----unique唯一键(设置为唯一键之后不允许重复)

主键和unique的
两者都有唯一性,但是主键不能为空,unique可以为空

65713961d6e14a61ab2292e44877eb60.png

空值与NULL
设置唯一键之后空值只能出现一次,NULL可以出现多次

存储引擎

存储引擎是mysql里面的一个组件,主要作用将内存中的数据存储到磁盘上和将磁盘中的数据加载到缓存池中

查看当前mysql支持的引擎
show engines;
  • InnoDB:表名.frm表结构,表名.ibd索引和数据,特性是 Supports transactions, row-level locking, and foreign keys
  • MyISAM:表名.frm表结构,表名.MYI索引文件,表名.MYD数据文件
  • MyISAM和InnoDB的区别:
    .InnoDB支持事务,而MyISAM不支持事务。
    .InnoDB支持外键,而MyISAM不支持外键。
    .InnoDB是行锁,而MyISAM是表锁(每次更新增加删除都会锁住表)。
    .InnoDB是聚簇索引,必须要有主键,一定会基于主键查询,但是辅助索引就会查询两次。MyISAM是非聚簇索引,索引和数据是分离的,索引里保存的是数据地址的指针,主键索引和辅助索引是分开的。
    .InnoDB不存储表的行数,所以select count( * )的时候会全表查询。而MyISAM会存放表的行数,select count(*)的时候会查的很快。
    
  • csv:存储数据时,用逗号分隔各个数据项。CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引。其可以作为一种数据交换的机制,存储的数据直接可以在操作系统里,用文本编辑器或者Excel读取。对于数据的快速导入、导出是有明显优势的。创建CSV表时,服务器会创建一个纯文本数据文件,其名称以表名开头并带有.CSV 扩展名。当你将数据存储到表中时,存储引擎将其以逗号分隔值格式保存到数据文件中。
  • memory置于内存的表。Memory采用的逻辑介质是内存,响应速度很快,但是当mysqld守护进程崩溃的时候数据会丢失,数据保存在内存里,特别适用于适用临时表的场景

 

972147cc00d0454c86f08371f5645847.png

mysql默认的四个库

mysql安装好后有4个默认的库
information_schema  信息库:数据字典库
    information_schema是一个信息数据库,它保存着关于MySQL服务器所维护的所有其他数据库的信息。(如数据库名,数据库的表,表栏的数据类型与访问权限等
    数据字典--》元数据:描述其他数据的数据
    中央情报局(统计局):收录了整个MySQL里的信息(能统计的一切信息)
   show  engiens  ; show character set;

performance_schema 性能架构库
        主要用于收集数据库服务器性能参数。
        执行某些操作会有性能相关的参数

sys:  MySQL系统
    Sys库所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。
mysql  :存放的是MySQL程序相关的表:登录用户表、时间相关表、db、权限表
    mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息

用户和权限管理

------查看创建用户使用手册

help create user

------创建用户

7cc7cfa22615456192f2f20627a27ff1.png

 -----授权

2ef5c0bd135f43629f60db93016c256a.png

e19898dfa46f4c749030342396dd80a1.png

对某些库、表有权限(局部权限)就写在db表里,如果对所有库、表有权限就写在user表中

e1c5936a9cfd42caac46883a000198dd.png

 a1c1bf5ac1b84bbc935c56aff963be3b.pngf3b185efae234f4eb416333bfc215279.png

root用户创建了一个yangzhi用户
root@(none) 20:49 mysql>create user 'yangzhi'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

root用户授予无论从哪登陆过来的yangzhi对所有库所有表有所有权限及授权权限
root@(none) 20:49 mysql>grant all on *.* to 'yangzhi'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)

登录yangzhi用户
[root@sc-mysql ~]# mysql -uyangzhi -p'123456';

yangzhi用户创建vivi用户
yangzhi@(none) 21:04 mysql>create user 'vivi'@'%'identified by '123456';
Query OK, 0 rows affected (0.00 sec)

授予vivi也有授权权限
yangzhi@(none) 21:04 mysql>grant all on *.* to 'vivi'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)

撤销yangzhi的所有权利
yangzhi@(none) 20:54 mysql>revoke all on *.* from 'yangzhi'@'%';
Query OK, 0 rows affected (0.00 sec)

-------insert

select database();可以知道当前在那个库里

 9ef70f52175941d3aca0df9a781ba015.png

1c9d7b1dfaf849569b7993bdd7169385.png

 有子查询优先子查询

sum()函数求和
select sum(amount) from players;
count()函数用来统计有多少行的数据
select count(*) from PLAYERS;--括号里面可以放字段名

9ab6eee18e5e490fb15f086d40709041.png

 11ab9989c6fe4c14929c86440226a7e0.png9ee8ea7db63847c481cc1e47ab2cfa2e.png

-------update

update中可以使用order by子句,要求以排序的顺序来一次更新行,

select * from PENALTIES order by amount asc;--升序
select * from PENALTIES order by amount desc;--降序

80885f1ba2b543d996450d5cb8278baa.png

598f1e80fd414941b2daecfe5b1ed10f.png

replace--当数据已存在的时候replace会把他替换掉,主键冲突的时候insert插入不了数据

  1173b72303c4479a8d7d8a5005eb6aac.png 

----delete

7393217b422a4446b7a258aa3504a0ec.png

 9673706bb1324ba8adbb96d45409c871.png

 !!!但是在where子查询中不允许访问要删除的行

所以正确做法是复制一张表,现在复制的表里查询 

bb4afa3bf0be49c49ad9e7dfe4dcade9.png

事务

 什么是事务?

一个数据库事务由一条或者多条sql语句组成,形成了一个逻辑的工作单元,这些sql要不全部执行成功,要不全部执行失败(一件事情完成一个任务,里面包含很多的操作)

b14537ecc973481aa57810fb5d09a452.png

 8b24362a55384d75b755e8ce13880ad7.png

 对于DDL和DCL事务@@autocommit对他们没有影响

6c83fd63a444437b9706cf13758d20a4.png

日志

 应用程序把工作过程中的事情记录下来保存到文件里,保存下来的就叫做日志

作用:了解程序运行是否正常,用来排错和数据分析

错误日志默认开启,存放在你数据目录下以.err结尾

f1dda6745c76454e9579786845dd0843.png

 修改配置文件

a202688572d44004a87af76a802d33e3.png

---------------------慢查询

作用:记录消耗时间比较长的sql语句,为数据库性能的提升提供线索,方便我们去优化

默认是10ms,超过10ms就认为慢了

默认存放在数据目录下以主机名+slow.log命名

ac04ab7242e648059eb5831086e13b3c.png 默认没有开启慢日志c5514caf2dda4af88e7e01b54c03e907.png

 开启并设置为0.001ms

vim /etc/my.cnf

 95b8998777dc429790b83317d31d5fb1.png

 --------------------通用日志(我们敲过的所有sql语句几乎都可以记录下来)

默认不开启  (消耗磁盘空间太大,消耗cpu,内存) 

71c5f02662d24b6ab6b7a3aee35b1d82.png

 a2094da4ae6d4cec8d5f0dd2ea1b0047.png

 ------------二进制日志(存放的是二进制数据)

默认不开启 

964933bd26e7428c87fa24606eb36fcf.png

d9dd14d7996941c88719c08235914afa.png

一个二进制文件记录了整个mysql进程里所有库的操作

会产生新的日志文件的情况
1,service mysqld restart
2,当日志到达最大值1G的时候也会产生新日志
3,flush logs
使用mysqlbinlog工具查看二进制日志

e7cbc431a39344f381592010fa891eb4.png

清除、删除所有二进制文件(一次性)
reset master
将指定的日志文件之前的日志删除
purge binary logs to '日志名';
将指定事件之前的日志清理
purge binary logs before '2018-02-01 12:00:00';

fc5813969f6e443bbe046cdaf9e1e5c1.png

3767576047e14ac28a8d7eebdbb41555.png

 ---------二进制日志格式

 ①row level:记录操作的每一行数据  --》表里的哪些行的数据发生了变化,默认格式

②statement level:记录用户输入的SQL语句

③mixed level:混合前两种

--------------redo和undo

https://zhuanlan.zhihu.com/p/410270379

----------------备份与还原

https://dev.mysql.com/doc/refman/5.7/en/backup-and-recovery.html

 灾备:

    热备(online):mysqld服务是运行的情况下去备份,

    冷备(offline):mysql服务需停止,然后去拷贝数据

备份方式:

336e1011a5d04e70ae15a8389bfdc2e3.png

    全备(全部备份):数据恢复方便,但是消耗空间大,时间长 

    增量备份:备好处是每次备份需要备份的数据较少,耗时较短,占用的空间较小;坏处是数据恢复比较麻烦

------------------------ Using mysqldump for Backups

https://dev.mysql.com/doc/refman/5.7/en/mysqldump-sql-format.html

1f0a13f77b054020b48f40641447e66d.png

 28d6dacc67bf48228befd931ddcd78af.png

  90b2b238410044d7aa64d8d5a6eba87b.png

 f8baaf442b5a4c42b69799f497d5a407.png

 -------------------------还原

0f6aa3ca10b04624832538fd7b401368.png

--------查看当前记录的二进制日志

show master status;

 主从复制

replay log中继日志

05a8954b06fe479ead270f66340e11c2.png

是主服务器主动通知从服务器来拉取二进制文件,还是从服务器每隔一段时间来拿二进制日志?
--是主服务器主动通知从服务器来拉去二进制文件
master上有个log dump thread会通知从服务器来拉取数据

##################搭建一个主从复制的MySQL集群

项目环境:2台2c/4的服务器,centos7.9+mysql5.7.33

项目描述:为了提升MySQL的并发能力构建一个简单的MySQL集群,实现读写分离,大大提升MySQL集群的性能;同时为了深入学习MySQL的整体部署和对集群架构的理解

项目步骤:

①准备好两台安装好的centos7系统,使用脚本一键安装二进制版本mysql,并且设置好my.cnf配置

②在master服务器上开启二进制日志、配置server_id,从服务器上也配置好server_id

6fceba22e5874c2bb351e711db15b5af.pnga97efde8d8224cc69e7d3b852bf8c68b.png

③在master服务器上创建一个用户,允许他从slave服务器上过来拿数据

create user 'lanqing'@'192.168.173.140' identified by'123456';

④在master上做全备,导出数据到slave上,保持master和slave的数据一致

主服务器上导出数据
mysqldump -uroot -p'beautiful888' --all-database >/backup/all_db.sql
远程拷贝到从服务器上
scp /backup/all_db.sql root@192.168.173.140:/root
从服务器导入数据
mysql -uroot -p'beautiful888' <all_db.sql

⑤在slave上配置去master上拉去二进制日志的用户名和密码以及日志文件的名称和位置

查看日志的记录位置
show master stauts
刷新日志
flush logs;
再次查看日志记录
show master status
之后
root@(none) 17:06  mysql>CHANGE MASTER TO MASTER_HOST='192.168.173.139',(master的ip)
    -> MASTER_USER='lanqing',(前面创建的允许slave过来拿数据的用户)
    -> MASTER_PASSWORD='123456',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='sc-mysql-bin.000004',(记录的日志文件)
    -> MASTER_LOG_POS=154;(记录的日志开始位置)
Query OK, 0 rows affected, 2 warnings (0.02 sec

⑥master、slave上都关闭防火墙和selinux

⑦在slave服务器上启动slave服务,查看IO线程和SQL线程是否正常启动

root@(none) 17:07  mysql>show slave status\G;--查看slave的状态

root@(none) 17:10  mysql>start slave;--开启slave

⑧验证主从复制的效果

主服务器新建一个库,从服务器上show databases;也能查看到

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值