吃透这50道题,再也不用担心sql运维了,废话不多说,咱们直接上干货!!!
概念:
关系型数据库是支持采用了关系模型的数据库,简单来说,关系模型就是指二维
表模型,而一个关系数据库就是由二维表及其之间的联系所组成的一个数据组织。
特点:
最大的特点就是事务的一致性。
优点:容易理解、使用方便、易于维护、支持 SQL。
缺点:
1. 高并发读写需求:网站的用户并发非常高,往往达到每秒上万次读写请求,对于
传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈。
2. 海量数据的高效读写:对于数据量巨大的网站来说,关系型数据库的查询效率非
常低。
3. 固定的表结构。
1.SQLserver
特点:真正的客户机/服务器体系结构
图形化用户界面
丰富的编程接口工具
与 Windows NT 完全集成
具有很好的伸缩性
应用场景:
主机为 Windows 系统,主要应用于 web 网站的建设,承载中小型 web 后台数据。
特点:体积小,总拥有成本低,开放源代码,可运行在多数系统平台上,轻量级易扩展。
应用场景:广泛的应用在 Internet 上的中小型网站中。
3.Oracle
特点:跨平台运行,安全性方面,性能最高。对硬件要求高,价格昂贵。
应用场景:大部分国企事业单位都用 Oracle,在电信行业占用最大的份额。
1. 使用键值对存储数据,且结构不固定
2. 一般不支持 ACID 特性。
3. 基于键值对,数据没有耦合性,容易扩展。
4. 不提供 SQL 支持,学习和使用成本较高。
MongoDB
特点:1.高性能,易部署,易使用。
2.面向集合存储,易存储对象类型的数据。
3.模式自由
4.自动处理碎片,以支持云计算层次的扩展性。
应用场景:
网站数据:mongodb 非常适合实时的插入,更新与查询。
缓存:适合作为信息基础设施的缓存层
大尺寸、低价值的数据
高伸缩性的场景
Redis
特点:1.性能极高,能支持超过 100k+每秒的读写频率
2.丰富的数据类型
3.所有操作都是原子性的
使用场景:
少量的数据存储,高速读写访问
SQLlite
特点:
1.嵌入式的,零配置,无需安装和管理配置
2.ACID 事务
3.存储在单一磁盘文件中的一个完整的数据库。
应用场景:
1.需要数据库的小型桌面软件。
2.需要数据库的手机软件。
3.作为数据容器的应用场景。
(1)DDL(Data Definition Language)---数据库定义语言(create、alter、drop),管 理基础数据库,例如:库,表
(2)DCL(Data Control Language)---数据控制语言(grant、revoke、commit、roll back),用户授权,权限回收,数据提交回滚等
(3)DML(Data Manipulation Language)---数据操作语言(select、insert、delete、update),针对数据库里的表,记录
char(4)定义的是固定长度 4,存储时,如果字符数不够 4 位,会在后面用空格补全存入数据库。
varchar(4)定义的是变长长度,存储时,如果字符没有达到定义的位数 4 时,也不会在
后面补空格。
grant all on *.* to smallstudent@'172.16.1.%' identified by '123456';
在一台服务器上,mysql 服务开启多个不同的端口,运行多个服务进程,这些 my sql 服务进程通过不同的 socket 来监听不同的数据端口,进而互不干涉的提供各自的服务。
1.避免直接从互联网访问 mysql 数据库,确保特定主机才拥有访问权限。
2.定期备份数据库
3.禁用或限制远程访问
在 my.cnf 文件里设置 bind-address 指定 ip
4.移除 test 数据库(默认匿名用户可以访问 test 数据库)
5.禁用 local infile
select load_file("/etc/passwd");
在 my.cnf 里[mysqld]下添加 set-variable=local-infile=0
6.移除匿名账户和废弃的账户
7.限制 mysql 数据库用户的权限
8.移除和禁用.mysql_history 文件
# cat ~/.mysql_history
# export MYSQL_HISTFILE=/dev/null
truncate table test 执行更快,清空物理文件,清空表中的所有内容
delete from test 是逻辑删除,按行删除,而且可以通过 where 语句选择要删除的行
show processlist\G
# mysqladmin -uroot -p123456 processlist
修改 my.cnf 文件里的 wait_timeout 的值,让其更小一些,默认 wait_timeout =28800,
这里改为 100
set global wait_timeout=100;
show global variables like "wait_timeout";
mysql 执行排序使用的缓冲大小。如果想要增加 order by 的速度,首先看是否可以让
mysql 使用索引而不是额外的排序阶段,如果不能,可以尝试增加 sort_buffer_size 变
量的大小。
set global sort_buffer_size =131072; #单位为 B,即 128KB,默认 64K
自动清除 set global expire_logs_days=30; #设置 binlog 过期时间为 30 天
手动清除 purge binary logs to "mysql-bin.000007"; #/删除 mysql-bin.000007 之前
的所有 binlog 日志
1.row level 行级模式
优点:记录数据详细(每行),主从一致
缺点:占用大量的磁盘空间,降低了磁盘的性能
2.statement level 模式(默认)
优点:记录的简单,内容少 ,节约了 IO,提高性能 缺点:导致主从不一致
3.MIXED 混合模式
结合了 statement 和 row 模式的优点,会根据执行的每一条具体的 SQL 语句来区
分对待记录的日志形式。对于函数,触发器,存储过程会自动使用 row level 模式
企业场景选择:
1.互联网公司使用 mysql 的功能较少(不用存储过程、触发器、函数),选择默认的
statement 模式。
2.用到 mysql 的特殊功能(存储过程、触发器、函数)则选则 MIXED 模式
3.用到 mysql 的特殊功能(存储过程、触发器、函数),有希望数据最大化一致则选
择 row 模式。
如果条件允许,操作前最好禁止外面一切服务器访问 mysql 数据库,这里假设禁止外
面访问数据库,具体步骤如下:
1. 手动切割 binlog 日志并记好切割好的 binlog 日志文件位置,这里假设为 009,备
份全部 binlog 日志
2. 找到之前全备数据最后备份到的 binlog 文件位置并记好位置,这几假设为 005
3. 用 mysqladmin 命令将 005 到 008binlog 文件中的 SQL 语句分离出来,并找到 dr
4. 将之前全备数据导入 mysql 服务器
5. 将步骤 3 中分离出的 SQL 语句导入 mysql 服务器
6. 将 009binlog 文件删除,再次刷新 binlog 日志,到此数据库已恢复成功。
1. 先用 sed 或 awk 将全库中的需要的表结构过滤出来
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `SC`/!d;q' /opt/bak_2017-12-07.sql
2. 再用 grep 将全库中相应的表内容过滤出来
grep 'INSERT INTO `SC`' /opt/bak_2017-12-07.sql
3. 将 1 和 2 中过滤出来的 SQL 语句导入数据库即可
画图。
1. 主:binlog 线程,记录所有改变了数据库数据的语句,放进 master 上的 binlog 中
2. 从:IO 线程,在使用 start slave 之后,负责从 master 上拉取 binlog 内容,放进
自己的 relay log 中
3. 从:SQL 执行线程,执行 relay log 中的语句。
配置步骤:
1. 主库开启 binlog 日志功能
2. 全备数据库,记录好 binlog 文件和相应的位置
3. 从库上配置和主库的连接信息
4. 将全备数据导入从库
5. 从库启动 slave
6. 在从库上查看同步状态,确认是否同步成功
在 my.cnf 文件中写入 log-bin=mysql-bin
两台数据库都开启 binlog 功能,相互为主从配置。
双主的实现方式主要有两种:
1. 让表的 ID 自增,然后主 1 写 1、3、5,主 2 写 2、4、6
2. 不让表的 ID 自增,然后通过 web 端程序去 seq 服务器取 ID,写入双主。
双主工作场景为高并发写的场景,慎用。
第一台数据库开启 binlog 功能设为主服务器,第二台数据库也开启 binlog 功能,设为
第一台服务器的从服务器,设为其他数据库的主服务器
解决办法 1:
登陆从库上操作:
1. stop slave 临时停止同步开关
2. set global sql_slave_skip_counter=1,将同步指针向下移动一个,也可以多个,
如果多次不同步,可以重复操作。
3. start slave,重启主从复制开关
解决办法 2:
在 my.cnf 配置文件中加入参数
slave-skip-errors=1032,1062,1007
查看 slave 端的 IO 和 SQL 进程状态是否 OK,同步延迟时间是否小于 1 分钟
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
1. 通过程序实现读写分离(性能,效率最佳,推荐
PHP 和 Java 程序都可以通过设置多个连接文件轻松的实现对数据库的读写分离,即
当 select 时,就去连接读库的连接文件,当 update、insert、delete 是就去连接写库
的连接文件。
2. 通过软件实现读写分离
MySQL-proxy,Amoeba 等代理软件也可以实现读写分离功能,但最常用最好用的还是
程序实现读写分离。
3. 开发 dbproxy
处理方法:重做 slave
1. 停止 slave
2. 导入备份数据
3. 配置 master.info 信息
4. 启动 slave
5. 检查从库状态
主库宕机分为数据库宕机和服务器宕机 2 种,不管哪种都要进行主从切换。
1.登陆从库检查 IO 线程和 SQL 线程状态 show processlist\G,确认 SQL 线程已读完所有 relay-log
2.登陆所有从库检查 master.info 信息,查看哪个从库的 binlog 文件和位置是最新的, \选择最新的从库切换为主库(或利用半同步功能,直接选择做了实时同步的从库为主库)
3.如果主库只是数据库宕了,服务器还在运行,则可以把 binlog 拉取到提升为主库的从库应用。
4.登陆要切换为主库的从库,进行切换操作。
stop slave;reset master;quit
5.进入要切换的从库数据目录,删除 master.info 和 relay-log.info 文件,并检查授权表,
read_only 等参数
6.修改 my.cnf 配置文件,开启 binlog,注释从库参数 log-bin=/data/3307/mysql-bin #log-slave-updates #read-only
7. 对同步用户进行提权,保证权限与主库用户权限一样
8. 重启数据库提生为主库
9. 其他从库操作
(1) 检查运行环境和用户
(2) 停止从库,修改 master 信息
(3) 启动从库同步,检查同步状态
10. 修改 web 程序的连接配置,从原主库指向新主库
11. 维护损坏的主库,完成后作为从库使用,或切换回来
12. 如果主库没有宕机,只是想按计划切换一下主库,就非常简单
(1) 主库锁表
(2) 登陆所有从库检查同步状态,查看是否完成同步。
(3) 其他按上面步骤进行切换
1. 一个主库的从库太多,导致复制延迟
建议从库数量 3-5 个为宜,要复制的从节点数量过多,会导致复制延迟
2. 从库硬件比主库差,导致复制延迟
查看 master 和 slave 的系统配置,可能会因为机器配置问题,包括磁盘 IO、CPU、
内存等各方面因素造成复制的延迟,一般发生在高并发大数据量的写入场景。
3. 慢 SQL 语句过多
假如一条 SQL 语句执行时间是 20 秒,那么执行完毕到从库上能查到数据也至少是 20 秒,可以修改后分多次写入,通过查看慢查询日志或 show full processlist 命令找出执行时间长的查询语句或者大的事务。
4. 主从复制设计问题
主从复制单线程,如果主库写并发太大,来不及传送到从库就会导致延迟。更高版本的mysql 可以支持多线程复制,门户网站则会自己开发多线程同步功能。
5. 主从库之间网络延迟
主从库的网卡,网线,连接的交换机等网络设备都可能成为复制的瓶颈,导致复制延迟,另外,跨公网主从复制很容易导致主从复制延迟。
6. 主库读写压力大,导致复制延迟
主库硬件要搞好一点,架构的前端要加 buffer。
1. 利用 mysqldump 做定时备份,根据情况可按天或按周做全库备份。
2. 用 rsync+inotify 对主库 binlog 做实时备份
事务就是指逻辑上的一组 SQL 语句操作,组成这组操作的各个 SQL 语句,执行时要么全成功要么全失败。
事务的四大特性(ACID):
1. 原子性(atomicity)
整个事务的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2. 一致性(consistency)
事务发生前和发生后,数据的完整性必须保持一致
3. 隔离性(isolation)
当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。
4. 持久性(durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的,如果出了错误,事务也不允许撤销。
全备:备份数据库所有数据
增备:一次性备份所有数据,然后再增量备份。
冷备:需要关闭 mysql 服务,读写请求均不允许状态下进行。
温备:服务在线,但仅支持读请求,不允许写请求的情况下备份。
热备:备份的同时,业务不受影响。
1. 在表中建立索引,优先考虑 where、group by 使用到的字段
2. 尽量避免使用 select *,返回无用的字段会降低查询效率
3. 尽量避免使用 in 和 not in,会导致数据库引擎放弃索引进行全表扫描
4. 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描
5. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描
a. InnoDB 支持事务,而 MyISAM 不支持事务。
b. InnoDB 支持行级锁,而 MyISAM 支持表级锁
c. InnoDB 支持 MVCC,而 MyISAM 不支持
d. InnoDB 支持外键,而 MyISAM 不支持
e. InnoDB 不支持全文索引,而 MyISAM 支持
(2) InnoDB 引擎的 3 大特性
插入缓存(insert buffer)、二次写(double write)、自适应哈希索引(ahi)、预读(read ahead)
(3)二者 select count(*)哪个更快,为什么?
MyISAM 更快,因为 MyISAM 内部维护了一个计数器,可以直接调取。
1. 修改 my.cnf 文件中的字符集配置
2. 查看当前字符集设置
show global variables like "character%";
3. 用 set 分别设置字符集变量值
set global character_set_client=utf8;
set global character_set_connection=utf8;
set global character_set_results=utf8;
set global character_set_database;
set global character_set_server;
set global character_set_system;
mysql 客户端 mysql 服务端 操作系统等字符集不一致导致的乱码,将上述字符集调成一致。
1. 硬件优化
CPU、内存、磁盘、网卡
2. 软件优化
(1) 操作系统:64 位,内核优化
(2) MySQL 编译安装、优化
3. my.cnf 里的参数优化
1. 主从复制+读写分离
优点:成本低、架构简单、易实施、维护方便
缺点:master 出现问题后不能自动到 slave 上,需要人工干涉。
2. MySQL Cluster
优点:安全性高,稳定性高。可以在线增加节点
缺点:架构复杂,至少三个节点,对于引擎只能用 ndb,不支持外键,管理复杂,部署费时而且是收费的。
3. Heartbeat /keepalived+双主从复制
优点:安全性、稳定性高,出现故障系统将自动切换,从而保证服务的连续性。
缺点:可能会发生脑裂
4. HeartBeat+DRBD+MySQL
优点:安全性、稳定性、出现故障系统将自动切换,从而保证服务的连续性。
缺点:只用一台服务器提供服务,成本高,可能发生脑裂
备份库: mysqldump -u 用户名 -p 密码 数据库名 >备份的文件名
备份表 mysqldump -u 用户名 -p 密码 数据库名 表名 >备份的文件名
#!/bin/sh
cmd="mysql -uroot -pabc123 -e"
$cmd "use 库名;show tables;"|grep -v Tables >/file.txt #将表名存到file.txt文件里
tables=/file.txt
for n in `cat $tables` #让变量 n 分别取 file.txt 文件里的表名
do
$cmd "use 库名;alter table $n engine=myisam"
done
#!/bin/sh
cmd="mysql -uroot -pabc123 -e"
$cmd "show databases;"|grep -v Database >/file.txt databases=/file.txt
for n in `cat $databases`
do
$cmd "alter database $n default character set utf8;"
done
举例?
1. 检查操作系统是否负载过高
2. 登陆 mysql 查看有哪些 sql 语句占用时间过长,show processlist;
3. 用 explain 查看消耗时间过长的 SQL 语句是否走了索引
4. 对 SQL 语句优化,建立索引
XtraBackup 基于 InnoDB 的 crash-recovery 功能,它会复制 InnoDB 的 data file,
由于不锁表,复制出来的数据是不一致的,在恢复的时候使用 crash-recovery,使得
数据恢复一致。
InnoDB 维护了一个 redo log,又称为 transaction log(事务日志),它包含了 InnoDB 数据的所有改动情况。当 InnoDB 启动的时候,它会先去检查 data file 和 transaction log
,并且会做两步操作:
XtraBackup 在备份的时候,一页一页的复制 InnoDB 的数据,而且不锁定表,与此同时,XtraBackup 还有另外一个线程监视着 transaction log,一旦 log 发生变化,
就把变化过的 log pages 复制走。为什么要着急复制走呢?因为 transaction log 文件
大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。
在 prepare 过程中,XtraBackup 使用复制到的 transaction log 对备份出来的 InnoDB
data file 进行 crash recovery
1. 关闭 mysql 服务
2. 移除 mysql 的 data 目录及数据
3. 将备份的数据恢复到 mysql 的 data 目录
4. 启动 mysql 服务
主从一致性校验有多种工具 例如 checksum、mysqldiff、pt-table-checksum 等
show global status where variable_name in('com_select','com_insert','com_delete','com_update');
| Com_delete | 0 |
| Com_insert | 0 |
| Com_select | 31897 |
| Com_update | 0 |
4 rows in set (0.00 sec)
普通索引:最基本的索引,没有任何限制。
唯一索引:与普通索引类似,不同的是,索引列的值必须唯一,但允许有空值。
主键索引:它是一种特殊的唯一索引,不允许有空值。
一张表只能有一个主键。
组合索引:就是将多个字段建到一个索引里。
mysqld_safe --defaults-file=/data/3306/my.cnf &
mysqladmin -u root-p123456 -S /data/3306/mysql.sock shutdown
通过程序实现的读写分离 insert、update、delete、alter 等走主库,select 等走从库
用--skip-extend-insert 选项
开源监控工具有很多,如 zabbix,nagios Lepus(天兔):简洁、直观、强大的开源数据库监控系统,MySQL/Oracle/MongoDB/ Redis 一站式性能监控,让数据库监控更简单
我们公司现在有两组 MySQL。其中一套是生产库,一套是测试库。
生产库和测试库都是用的 mha +半同步复制做的高可用。
我们所有的项目 web 前端量(大概有 10 个项目)指向的都是一个机器上的 mysql 实例。因为我们是传统行业,并发访问量并不是很大,所以目前我们的生产 mysql数据库未出现性能问题。
只给 insert,update,select 和 delete 四个权限即可。有时候 delete 都不给。
1、首先我会用 top 命令和 iostat 命令,定位是什么进程在占用 cpu 和磁盘 io;
2、如果是 mysql 的问题,我会登录到数据库,通过 show full processlist 命令,看现在数
据库在执行什么 sql 语句,是否有语句长时间执行使数据库卡住;
3、执行 show engine innodb status\G 命令,查看数据库是否有锁资源争用;
4、查看 mysql 慢查询日志,看是否有慢 sql;
5、找到引起数据库占用资源高的语句,进行优化,该建索引的建索引,索引不合适的删索
引,或者根据情况 kill 掉耗费资源的 sql 语句等
如果您觉得文章有帮助,欢迎点赞收藏加关注,一连三击呀,感谢!!☺☻