mysql
myisam与innodb存储引擎的特性
MYISAM引擎特点:
不支持事务,表级锁,读写相互阻塞,读时不能写,写时不能读,不支持外键约束,不支持聚簇索引,不支持多版本并发控制(MVCC),崩溃恢复性较差,读取数据较快,占用资源较少
MYISAM引擎文件
tb1_name.frm(表格式定义) tb1_name.MYI(索引文件) tb1_name.MYD(数据文件)
INNODB存储引擎特性
支持事务,支持行级锁,支持聚簇索引,支持MVCC,读写阻塞与事务隔离级别相关,5.5以后支持全文索引
INNODB引擎文件
所有INNODB表的数据和索引放置于一个表空间
表空间文件:datadir指定的路径
数据文件:ibddata1,ibddata2...
每个表使用一个表空间存储表的数据和索引
MySQL的连接类型
解释MySQL内连接,外连接与自连接的区别
内连接:连接的数据表相对应的匹配字段完全相等的连接
外连接分为左外连接和右外连接,全连接
左连接的结果集包括制定的左表的全部数据与匹配右表的数据,右表中没匹配的全为空值
右连接的结果集包括指定的右表的全部数据与匹配左表的数据,左表中没匹配的全为空值
全连接返回左右数据表中的所有行
自连接:不需要人为指定连接字段,自然会自动找同名字段进行连接,会删除连接后的重复列
数据库中的事务是什么
事务是作为一个单元的一组有序的数据库操作,如果所有操作全完成,事务则提交,如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消
ACID四大特性:原子性,隔离性,一致性,持久性
MySQL中的事务回滚机制概述
事务回滚是指将该事务已经完成的对数据库的更新操作撤销
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二张表出现异常而没能修改第一个表和第二个表都要回到未修改状态,这就是所谓的事务回滚
数据语言包括哪几部分?每部分都有哪些操作的关键字?
数据定义语言(DDL)
create drop alter
数据操纵语言(DML)
delete insert update
数据控制
grant revoke
数据查询
slecte
事务的四个隔离级别
read uncommitted(读未提交)
可读取到未提交的数据,产生脏读
read committed(读提交)
可读取到提交的数据,但未提交的不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取到的数据不一样,产生幻读
repeatable rede(可重复读)
多次读取的数据都一样,即读取过程中,即使有其它提交的事务修改数据,仍能读取到未修改前的旧数据,此为默认设置
searializable(可串行化)
未提交的读事务阻塞修改事务,或者未提交的修改事务阻塞读事务,导致并发性能差
mysql备份原理
冷备:读写操作均不可进行
温备: 读操作可执行,但写操作不可执行
热备:读写操作均可执行
物理备份:直接复制文件数据进行备份,与存储引擎有关,占用较多的空间,速度开
逻辑备份:从数据库中导出数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度
mysql备份
mysqldump
-A --all-databases 备份整个库
--database 备份指定的库
-F 滚动日志
--master-data=(1|2) 显示二进制日志的位置 1 用于复制 2 用于备份
--single-transaction 以一个事务的方式启用备份
例:
mysqldump -A -F --single-transaction --master-data=2 > /data/all.sql
mysqldump --database DB1.... --master-data=2 > /BACKDIR/DB.sql
MySQL的主从复原理
当从服务器开启复制线程后,从服务器会以客户端的身份用具有复制权限的账号(I/0线程)向主服务器发送读取主服务器二进制的请求
当主服务器收到请求后,会开启dump线程将数据响应给从服务器
从服务器收到数据后先把数据存储在自己的中继日志,而后会开启一个sql线程读取并执行里面的语句,保存到磁盘中
实现方式
主服务器:
在主服务器配置文件中开启二进制日志(log_bin=master-bin)
并设置一个全局唯一的serverID(server_id=1)
启动服务,查看当前二进制日志位置,创建一个有复制权限的账号
show master logs 或 show binary logs
(grant replication slave on *.* to "NAME"@'HOSTIP' identified by 'PASSWORD')
从服务器
在从服务器配置文件中开启中继日志(relay_log=relay-bin)
并设置一个全局唯一的serverID(server_id=2)
启动服务,授权
change master to .......
启动复制线程
start slave
查看复制线程(show slave status) 如果想换复制账号停止复制线程(stop slave) 然后清除(reset slave all)
级联复制(至少三台服务器)
主服务器
在主服务器配置文件中开启二进制日志(log_bin=master-bin)
并设置一个全局唯一的serverID(server_id=1)
启动服务,查看当前二进制日志位置,创建一个有复制权限的账号
show master logs 或 show binary logs
(grant replication slave on *.* to "NAME"@'HOSTIP' identified by 'PASSWORD')
做一个完全备份
mysqldump -A -F --single-transaction --master-data=1 > /data/all.sql
将完全备份传送给级联服务器
级联服务器
在级联服务器配置文件中添加(relay_log=relay-bin) (log_bin) (log_slave_updates) (read_only)
并设置一个全局唯一的serverID(server_id=2)
启动服务,导入主服务器的完全备份
mysql < /data/all.sql
查看二进制日志位置,授权
show master logs;
change master to .......(主服务器)
启动复制线程
start slave
做一个完全备份
mysqldump -A -F --single-transaction --master-data=1 > /data/all.sql
将完全备份传送给从服务器
从服务器
在从服务器配置文件中开启中继日志(relay_log=relay-bin)
并设置一个全局唯一的serverID(server_id=2)
启动服务,导入备份
mysql < /data/all.sql
授权
change master to ....... (级联服务器)
启动复制线程
start slave
半同步复制(至少三台)
主服务器:
在主服务器配置文件中开启二进制日志(log_bin=master-bin)
并设置一个全局唯一的serverID(server_id=1)
启动服务,安装插件
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>set global rpl_semi_sync_master_enabled=on;
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%';
查看当前二进制日志位置,创建一个有复制权限的账号
show master logs 或 show binary logs
(grant replication slave on *.* to "NAME"@'HOSTIP' identified by 'PASSWORD')
做一个完全备份
mysqldump -A -F --single-transaction --master-data=1 > /data/all.sql
将完全备份传送给所有从服务器
从服务器
在从服务器配置文件中开启中继日志(relay_log=relay-bin)
并设置一个全局唯一的serverID(server_id=2)
启动服务,导入备份
mysql < /data/all.sql
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1;
mysql>start slave;
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%';
授权
change master to ....... (级联服务器)
启动复制线程
start slave
基于SSL的主从复制
先自建CA ,为主服务器和从服务器颁发证书
主服务器
在主服务器配置文件中添加 server_id=1 ,log-bin=master-bin , ssl_ca=CA的证书 ,ssl_cert=主服务器的证书 , ssl_key=主服务器的私钥
创建一个有复制权限的账号 (可以创建一个必须使用ssl登录的账号)
mysql>grant replication slave on *.* to repluser2@'192.168.37.%' identified by 'centos' require ssl;
查看二进制位置
mysql>show master logs;
做一个完全备份
mysqldump -A -F --single-transaction --master-data=1 > /data/all.sql
将完全备份传送给所有从服务器
从服务器
在配置文件中添加 server_id=2 ,relay_log=relay-bin,
启动服务。导入完全备份
mysql < /data/all.sql
授权
mysql> CHANGE MASTER TO MASTER_HOST='主服务器',MASTER_USER='repluser2',,MASTER_PASSWORD='centos',,MASTER_LOG_FILE='mariadb-bin.000004',,MASTER_LOG_POS=413,,MASTER_SSL=1,,MASTER_SSL_CA = CA的证书,MASTER_SSL_CERT = 从服务器的证书,MASTER_SSL_KEY = 从服务器的key
启动服务
start slave;