-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9f47590
commit 5c598fc
Showing
8 changed files
with
398 additions
and
2 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
## Mysql集群相关 | ||
|
||
### 主从复制 | ||
|
||
![image-20200508093831919](../../Images/image-20200508093831919.png) | ||
|
||
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库; | ||
|
||
主数据库一般是准实时的业务数据库 | ||
|
||
#### 主从复制的作用 | ||
|
||
1. 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。 | ||
2. 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。 | ||
3. 读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。 | ||
4. 备份,避免影响业务 | ||
|
||
|
||
|
||
#### 主从复制的原理 | ||
|
||
1.数据库有个bin-log二进制文件,记录了所有sql语句。 | ||
|
||
2.从数据库把主数据库的bin-log文件的sql语句复制过来。 | ||
|
||
3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。 | ||
|
||
具体需要==三个线程==来操作: | ||
|
||
1. binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。 | ||
|
||
在从库里,当复制开始的时候,从库就会创建两个线程进行处理: | ||
|
||
2. 从库I/O线程。当`START SLAVE`语句在从库开始执行之后,从库创建一个 I/O Thread ,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。(如果该线程追赶上了主库,会进入睡眠状态)从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。 | ||
|
||
3. 从库的SQL线程。从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。 | ||
|
||
可以知道,对于每一个主从复制的连接,都有三个线程。 | ||
|
||
#### 具体过程 | ||
|
||
![image-20200508101335190](../../Images/image-20200508101335190.png) | ||
|
||
拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。 | ||
|
||
1. slave 服务器执行 start slave,开启主从复制开关,slave 服务器的 I/O Thread 请求从 master 服务器读取 binlog(如果该线程追赶上了主库,会进入睡眠状态) | ||
|
||
2. master 服务器创建 Log Dump Thread,把 binlog 发送给 slave 服务器。slave 服务器的 I/O Thread 将读取到的 binlog 日志内容写入中继日志 relay log(中继日志,mysql-relay-bin.xxxxxx,会记录位置信息,以便下次继续读取) | ||
|
||
3. slave 服务器的 SQL Thread 会实时监测 relay log 新增的日志内容,Exec_Master_Log_Pos位置开始执行读取到的更新事件,并解析成 SQL 语句,并执行,以此实现主从的操作一致,而最终数据一致; | ||
|
||
### 主从复制存在的问题 | ||
|
||
在高并发场景下,从库的数据一定会比主库慢一些,是**有延时**的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。 | ||
|
||
- 主库宕机后,数据可能丢失 | ||
- 从库只有一个sql Thread,主库写压力大,复制很可能延时 | ||
|
||
解决方法: | ||
|
||
- 半同步复制—解决数据丢失的问题 | ||
- 并行复制—-解决从库复制延迟的问题 | ||
|
||
#### 半同步复制 | ||
|
||
**mysql semi-sync(半同步复制)** | ||
|
||
半同步复制: | ||
|
||
- 5.5集成到mysql,以插件的形式存在,需要单独安装 | ||
- 确保事务提交后binlog至少传输到一个从库 | ||
- 不保证从库应用完这个事务的binlog | ||
- 性能有一定的降低,响应时间会更长 | ||
- 网络异常或从库宕机,卡主主库,直到超时或从库恢复 | ||
|
||
##### 半同步复制原理 | ||
|
||
5.5之前,MySQL的复制其实是异步操作,而不是同步 | ||
|
||
- 事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端 | ||
- 5.5集成到mysql,以插件的形式存在,需要单独安装 | ||
- 确保事务提交后binlog至少传输到一个从库 | ||
- 不保证从库应用完成这个事务的binlog | ||
- 性能有一定的降低 | ||
- 网络异常或从库宕机,卡主库,直到超时或从库恢复 | ||
|
||
|
||
![image-20200508102608780](../../Images/image-20200508102608780.png) | ||
|
||
#### 并行复制 | ||
|
||
mysql并行复制 | ||
|
||
- 社区版5.6中新增 | ||
- 并行是指从库多线程apply binlog库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)设置 | ||
- 设置sql线程数为10 `set global slave_parallel_workers=10;` | ||
|
||
|
||
### 复制出错处理 | ||
|
||
常见:1062(主键冲突),1032(记录不存在) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
## Mysql索引 | ||
|
||
### 什么是索引 | ||
|
||
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 | ||
|
||
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 | ||
|
||
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。 | ||
|
||
|
||
|
||
### 索引有哪些优缺点? | ||
|
||
#### 索引的优点 | ||
|
||
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 | ||
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 | ||
|
||
#### 索引的缺点 | ||
|
||
时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率; | ||
|
||
空间方面:索引需要占物理空间。 | ||
|
||
|
||
|
||
### 索引的分类 | ||
|
||
- 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。 | ||
- 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。 | ||
- 可以通过`ALTER TABLE table_name ADD UNIQUE (column);`创建唯一索引 | ||
- 可以通过 `ALTER TABLE table_name ADD UNIQUE (column1,column2);` 创建唯一组合索引 | ||
|
||
- 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。 | ||
- 可以通过`ALTER TABLE table_name ADD INDEX index_name (column);`创建普通索引 | ||
- 可以通过`ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);`创建组合索引 | ||
|
||
- 全文索引: 是目前搜索引擎使用的一种关键技术。 | ||
- 可以通过`ALTER TABLE table_name ADD FULLTEXT (column);`创建全文索引 | ||
|
||
|
||
|
||
|
||
|
||
### 误操作drop语句导致数据库数据破坏,请给出恢复的实际大体步骤 | ||
|
||
``` | ||
手动切割binlog日志并记好切割好的binlog日志文件位置,这里假设为009,备份全部binlog日志 | ||
找到之前全备数据最后备份到的binlog文件位置并记好位置,这里假设为005 | ||
用mysqladmin命令将005到008binlog文件中的SQL语句分离出来,并找到drop库的语句将其删掉 | ||
将之前全备数据导入mysql服务器 | ||
将步骤3中分离出的SQL语句导入mysql服务器 | ||
将009binlog文件删除,再次刷新binlog日志,到此数据库已恢复成功 | ||
``` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
## Redis | ||
|
||
### Redis工作原理 | ||
|
||
Redis是一个key-value存储系统,它支持的value类型相对较多,包括string、list、set和zset,这些数据都支持push/pop/add/remove及交并补等操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同方式的排序。 | ||
|
||
为了保证效率,数据是缓存在内存中的,Redis会周期性的把数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave同步 | ||
|
||
### Redis持久化-RDB | ||
|
||
在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中,当Redis需要重启时,RDB程序会通过重载RDB文件来还原数据库。 | ||
|
||
#### 保存(rdbSave) | ||
|
||
rdbSave负责将内存中的数据库数据以RDB格式保存到磁盘中,如果RDB文件已经存在将会替换已有的RDB文件。保存RDB文件期间会阻塞主进程,这段时间期间将不能处理新的客户端请求,直到保存完成为止。 | ||
|
||
#### 读取(rdbLoad) | ||
|
||
当Redis启动时,会根据配置的持久化模式,决定是否读取RDB文件,并将其中的对象加载到内存中。 | ||
|
||
### Redis持久化-AOF | ||
|
||
以协议文本的方式,将所有对数据库进行的写入命令记录到AOF文件,达到记录数据库状态的目的。 | ||
|
||
#### AOF的保存 | ||
|
||
1. 将客户端请求的命令转换为网络协议格式 | ||
2. 将协议内容字符串追加到变量server.aof_buf中 | ||
3. 当AOF系统达到设定的条件时,会调用aof_fsync(文件描述符号)将数据写入磁盘 | ||
|
||
#### AOF的读取 | ||
|
||
1. AOF保存的是数据协议格式的数据,所以只要将AOF中的数据转换为命令,模拟客户端重新执行一遍,就可以还原所有数据库状态。 | ||
2. 创建模拟的客户端 | ||
3. 读取AOF保存的文本,还原数据为原命令和原参数。然后使用模拟的客户端发出这个命令请求。 | ||
4. 继续执行第二步,直到读取完AOF文件 | ||
|
||
#### AOF重写流程 | ||
|
||
1. AOF重写完成会向主进程发送一个完成的信号 | ||
2. 会将AOF重写缓存中的数据全部写入到文件中 | ||
3. 用新的AOF文件,覆盖原有的AOF文件。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
## SQL语句 | ||
|
||
### 增 | ||
|
||
#### 增创建用户: | ||
|
||
```mysql | ||
mysql>create user test@‘%’ identified by ‘123456’; | ||
``` | ||
|
||
#### 创建数据库: | ||
|
||
```mysql | ||
mysql>create database web; | ||
``` | ||
|
||
#### 创建数据表: | ||
|
||
```mysql | ||
mysql>create table a1 (id int ,name char(30)); | ||
``` | ||
|
||
#### 插入数据: | ||
|
||
```mysql | ||
mysql>insert into a2 (id,name,age) values (1,‘zhangsan’,21); | ||
``` | ||
|
||
### 删 | ||
|
||
#### 删除用户: | ||
|
||
```mysql | ||
mysql>drop user test@’%’; | ||
``` | ||
|
||
#### 删除数据库: | ||
|
||
```mysql | ||
mysql>drop database web; | ||
``` | ||
|
||
#### 删除数据表: | ||
|
||
```mysql | ||
mysql>drop table a1; | ||
``` | ||
|
||
#### 删除数据: | ||
|
||
```mysql | ||
mysql>delete from a2 where id=5; | ||
|
||
mysql>delete from a2 where age between 23 and 25; | ||
``` | ||
|
||
### 改 | ||
|
||
#### 修改表中的数据: | ||
|
||
```mysql | ||
mysql>update a2 set age=21 where id=3; | ||
``` | ||
|
||
#### 修改数据表的名称: | ||
|
||
```mysql | ||
mysql>alter table a2 rename a1; | ||
``` | ||
|
||
|
||
|
||
#### 修改数据表的字段类型: | ||
|
||
```mysql | ||
mysql>describe a1; | ||
|
||
mysql>alter table a1 modify name char(50); | ||
|
||
mysql>describe a1; | ||
``` | ||
|
||
#### 修改数据表的字段类型: | ||
|
||
```mysql | ||
mysql>alter table a1 change name username char(50) not null default ‘’; | ||
|
||
mysql>describe a1; | ||
``` | ||
|
||
#### 添加删除字段 | ||
|
||
```mysql | ||
mysql>alter table a1 add time datetime; | ||
|
||
mysql>alter table a1 drop time; | ||
``` | ||
|
||
### 查 | ||
|
||
#### 查看所有数据库: | ||
|
||
```mysql | ||
mysql>show databases; | ||
``` | ||
|
||
#### 查看指定库内所有数据表: | ||
|
||
```mysql | ||
mysql>show tables; | ||
``` | ||
|
||
#### 查看指定数据表的字段结构: | ||
|
||
```mysql | ||
mysql>describe a1; | ||
``` | ||
|
||
#### 查看所有MySQL用户密码及登录方式: | ||
|
||
```mysql | ||
mysql>select User,Password,Host from mysql.user; | ||
``` | ||
|
||
### 授权 | ||
|
||
#### 授予用户全部权限: | ||
|
||
```mysql | ||
mysql>grant all on aa.a1 to test@‘%’;#给已存在用户授权 | ||
|
||
mysql>grant all on aa.a1 to abc@‘%’ identified by ‘123456’;#创建用户并授权 | ||
``` | ||
|
||
#### 取消abc用户的删除库、表、表中数据的权限: | ||
|
||
```mysql | ||
mysql>revoke drop,delete on aa.a1 from abc@‘%’;#取消删除权限(登录abc测试) | ||
|
||
mysql>show grants for abc@‘%’;#查看指定用户的授权 | ||
|
||
mysql>show grants for test@‘%’; | ||
``` | ||
|
||
### 启动关闭 | ||
|
||
#### 启动: | ||
|
||
```mysql | ||
service mysqld start | ||
|
||
/etc/init.d/mysqld start | ||
|
||
mysqld_safe & | ||
``` | ||
|
||
|
||
|
||
#### 关闭: | ||
|
||
```mysql | ||
service mysqld stop | ||
|
||
/etc/init.d/mysqld stop | ||
|
||
mysqladmin -uroot -p123456 shutdown | ||
``` | ||
|
Oops, something went wrong.