数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统。php
层次性数据库mysql
关系型数据库面试
关系数据库管理系统的常见种类sql
面向对象的数据库数据库
DDL(数据定义语言)编程
DML(数据操做语言)安全
DCL(数据控制语言)性能优化
名称不能重复bash
integer服务器
char
varchar
data
以上内容是对通用数据库以及sql语句相关的知识点介绍,本文不作过多的赘述,本文主要针对关系型数据库:MySQL 来进行各方面的知识点总结。
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不一样的表中,而不是将全部数据放在一个大仓库内,这样就增长了速度并提升了灵活性。
在平常工做与学习中,不管是开发、运维、仍是测试,对于数据库的学习是不可避免的,同时也是平常工做的必备技术之一。在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的仍是MySQL。更多关于MySQL数据库的介绍,有兴趣的读者能够参考官方网站的文档和这篇文章:多是全网最好的MySQL重要知识点
MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看:MySQL 5.7 vs 8.0,哪一个性能更牛?
详细的安装步骤请参阅:CentOS 下 MySQL 8.0 安装部署,超详细!
Windows服务
-- 启动MySQL net start mysql -- 建立Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)
链接与断开服务器
mysql -h 地址 -P 端口 -u 用户名 -p 密码 SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息
数据库操做
-- 查看当前数据库 SELECT DATABASE(); -- 显示当前时间、用户名、数据库版本 SELECT now(), user(), version(); -- 建立库 CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项 数据库选项: CHARACTER SET charset_name COLLATE collation_name -- 查看已有库 SHOW DATABASES[ LIKE 'PATTERN'] -- 查看当前库信息 SHOW CREATE DATABASE 数据库名 -- 修改库的选项信息 ALTER DATABASE 库名 选项信息 -- 删除库 DROP DATABASE[ IF EXISTS] 数据库名 同时删除该数据库相关的目录及其目录内容
表的操做
-- 建立表 CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项] 每一个字段必须有数据类型 最后一个字段后不能有逗号 TEMPORARY 临时表,会话结束时表自动消失 对于字段的定义: 字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] -- 表选项 -- 字符集 CHARSET = charset_name 若是表没有设定,则使用数据库字符集 -- 存储引擎 ENGINE = engine_name 表在管理数据时采用的不一样的数据结构,结构不一样会致使处理方式、提供的特性操做等不一样 常见的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive 不一样的引擎在保存表的结构和数据时采用不一样的方式 MyISAM表文件含义:.frm表定义,.MYD表数据,.MYI表索引 InnoDB表文件含义:.frm表定义,表空间数据和日志文件 SHOW ENGINES -- 显示存储引擎的状态信息 SHOW ENGINE 引擎名 {LOGS|STATUS} -- 显示存储引擎的日志或状态信息 -- 自增起始数 AUTO_INCREMENT = 行数 -- 数据文件目录 DATA DIRECTORY = '目录' -- 索引文件目录 INDEX DIRECTORY = '目录' -- 表注释 COMMENT = 'string' -- 分区选项 PARTITION BY ... (详细见手册) -- 查看全部表 SHOW TABLES[ LIKE 'pattern'] SHOW TABLES FROM 表名 -- 查看表机构 SHOW CREATE TABLE 表名 (信息更详细) DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN'] SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] -- 修改表 -- 修改表自己的选项 ALTER TABLE 表名 表的选项 eg: ALTER TABLE 表名 ENGINE=MYISAM; -- 对表进行重命名 RENAME TABLE 原表名 TO 新表名 RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另外一个数据库) -- RENAME能够交换两个表名 -- 修改表的字段机构(13.1.2. ALTER TABLE语法) ALTER TABLE 表名 操做名 -- 操做名 ADD[ COLUMN] 字段定义 -- 增长字段 AFTER 字段名 -- 表示增长在该字段名后面 FIRST -- 表示增长在第一个 ADD PRIMARY KEY(字段名) -- 建立主键 ADD UNIQUE [索引名] (字段名)-- 建立惟一索引 ADD INDEX [索引名] (字段名) -- 建立普通索引 DROP[ COLUMN] 字段名 -- 删除字段 MODIFY[ COLUMN] 字段名 字段属性 -- 支持对字段属性进行修改,不能修改字段名(全部原有属性也需写上) CHANGE[ COLUMN] 原字段名 新字段名 字段属性 -- 支持对字段名修改 DROP PRIMARY KEY -- 删除主键(删除主键前需删除其AUTO_INCREMENT属性) DROP INDEX 索引名 -- 删除索引 DROP FOREIGN KEY 外键 -- 删除外键 -- 删除表 DROP TABLE[ IF EXISTS] 表名 ... -- 清空表数据 TRUNCATE [TABLE] 表名 -- 复制表结构 CREATE TABLE 表名 LIKE 要复制的表名 -- 复制表结构和数据 CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名 -- 检查表是否有错误 CHECK TABLE tbl_name [, tbl_name] ... [option] ... -- 优化表 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... -- 修复表 REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM] -- 分析表 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
更多相关的操做基础知识点请参阅如下文章:
Gtid方式:global transaction identifiers是基于事务来复制数据,所以也就不 依赖日志文件位置,同时又能更好的保证主从库数据一致性。
MySQL主从复制延迟解决方案:高可用数据库主从复制延时的解决方案
逻辑备份的速度要慢于物理备份,是由于逻辑备份须要访问数据库并将内容转化成逻辑备份须要的格式;一般输出的备份文件大小也要比物理备份大;另外逻辑备份也不包含数据库的配置文件和日志文件内容;备份和恢复的粒度能够是全部数据库,也能够是单个数据库,也能够是单个表;逻辑备份须要再数据库运行的状态下执行;它的执行工具能够是mysqldump或者是select … into outfile两种方式
MHA Manager会定时探测集群中的master节点,当master出现故障时,它能够自动将最新数据的slave提高为新的master,而后将全部其余的slave从新指向新的master。整个故障转移过程对应用程序彻底透明。
MHA高可用方案实战:MySQL集群高可用架构之MHA
海量数据的存储和访问成为了系统设计的瓶颈问题,日益增加的业务数据,无疑对数据库形成了至关大的负载,同时对于系统的稳定性和扩展性提出很高的要求。随着时间和业务的发展,数据库中的表会愈来愈多,表中的数据量也会愈来愈大,相应地,数据操做的开销也会愈来愈大;另外,不管怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、链接数)老是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。分表、分库和读写分离能够有效地减少单台数据库的压力。
MySQL读写分离高可用架构实战案例:
顾名思义,B-tree索引使用B-tree的数据结构存储数据,不一样的存储引擎以不一样的方式使用B-Tree索引,好比MyISAM使用前缀压缩技术使得索引空间更小,而InnoDB则按照原数据格式存储,且MyISAM索引在索引中记录了对应数据的物理位置,而InnoDB则在索引中记录了对应的主键数值。B-Tree一般意味着全部的值都是按顺序存储,而且每一个叶子页到根的距离相同。
B-Tree索引驱使存储引擎再也不经过全表扫描获取数据,而是从索引的根节点开始查找,在根节点和中间节点都存放了指向下层节点的指针,经过比较节点页的值和要查找值能够找到合适的指针进入下层子节点,直到最下层的叶子节点,最终的结果就是要么找到对应的值,要么找不到对应的值。整个B-tree树的深度和表的大小直接相关。
全键值匹配:和索引中的全部列都进行匹配,好比查找姓名为zhang san,出生于1982-1-1的人
匹配最左前缀:和索引中的最左边的列进行匹配,好比查找全部姓为zhang的人
匹配列前缀:匹配索引最左边列的开头部分,好比查找全部以z开头的姓名的人
匹配范围值:匹配索引列的范围区域值,好比查找姓在li和wang之间的人
精确匹配左边列并范围匹配右边的列:好比查找全部姓为Zhang,且名字以K开头的人
MySQL 经常使用30种SQL查询语句优化方法|MySQL太慢?试试这些诊断思路和工具
但当表中含有主键或惟⼀键时,则每一个被⽤做分区函数的字段必须是表中惟⼀键和主键的所有或⼀部分,不然就⽆法建立分区表。
查询条件尽可能优化,尽可能避免Select * 的方式,大量数据结果集下,会消耗大量 带宽和CPU资源,查询尽可能避免返回大量结果集,而且尽可能为频繁使用的查询语句创建索引。
数据库分库分表概述:数据库分库分表,什么时候分?怎样分?
Mysql分库分表方案:MySQL 分库分表方案,总结的很是好!
Mysql分库分表的思路:解救 DBA—数据库分库分表思路及案例分析
MySQL性能监控的指标大致能够分为如下4大类:
缓冲池利用率
对于MySQL性能监控,官方也提供了相关的服务插件:MySQL-Percona,下面简单介绍一下插件的安装
[root@db01 ~]# yum -y install php php-mysql [root@db01 ~]# wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm [root@db01 ~]# rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm warning: percona-zabbix-templates-1.1.8-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY Preparing... ################################# [100%] Updating / installing... 1:percona-zabbix-templates-1.1.8-1 ################################# [100%] Scripts are installed to /var/lib/zabbix/percona/scripts Templates are installed to /var/lib/zabbix/percona/templates
最后,能够配合其它监控工具来实现对MySQL的性能监控。
MySQL服务器配置插件:
修改MySQL的sock文件路径
[root@db01 ~]# sed -i '30c $mysql_user = "monitor";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php [root@db01 ~]# sed -i '31c $mysql_pass = "123456";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php [root@db01 ~]# sed -i '33c $mysql_socket = "/tmp/mysql.sock";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
测试是否可用( 能够从MySQL中获取到监控值 )
[root@db01 ~]# /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg gg:12 # 确保当前文件的 属主 属组 是zabbix,不然zabbix监控取值错误。 [root@db01 ~]# ll -sh /tmp/localhost-mysql_cacti_stats.txt 4.0K -rw-rw-r-- 1 zabbix zabbix 1.3K Dec 5 17:34 /tmp/localhost-mysql_cacti_stats.txt
移动zabbix-agent配置文件到 /etc/zabbix/zabbix_agentd.d/目录
[root@db01 ~]# mv /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/ [root@db01 ~]# systemctl restart zabbix-agent.service
导入并配置Zabbix模板与主机:
默认模板监控时间为 5分钟 ( 当前测试修改成 30s) 同时也要修改Zabbix模板时间
# 若是要修改监控获取值的时间不但要在zabbix面板修改取值时间,bash脚本也要修改。 [root@db01 scripts]# sed -n '/TIMEFLM/p' /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_cacti_stats.txt` if [ `expr $TIMENOW - $TIMEFLM` -gt 300 ]; then # 这个 300 表明 300s 同时也要修改。
默认模板版本为 2.0.9,没法在4.0版本使用,能够先从3.0版本导出,而后再导入4.0版本 。
其实,在实际生产过程当中,仍是有相关的专业监控数据库的第三方开源软件的,民工哥以前也写过相关的文章,今天发出来供你们参考:强大的开源企业级数据库监控利器Lepus
MySQL是最普遍使用和流行的开源数据库之一,围绕它有许多工具,可让设计,建立和管理数据库的过程变得更加容易和便捷。可是如何选择最适合本身需求的工具,并不容易。这里为你们推荐:10款MySQL的GUI工具,它们对开发人员和DBA来讲都是不错的解决方案。
很早以前民工哥就给你们介绍过一款开源的SQL管理工具:自动补全、回滚!介绍一款可视化 sql 诊断利器。
今天,民工哥再给你们推荐一款SQL审核利器: MySQL 自动化运维工具 goinception。
可视化管理工具,你们能够试试这个:介绍一款免费好用的可视化数据库管理工具
先给你们看几个实例的错误分析与解决方案。
问题分析:多是数据库没有启动或者是端口被防火墙禁止。
解决方法:启动数据库或者防火墙开放数据库监听端口。
问题分析:密码不正确或者没有权限访问。
解决方法:
1)修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables,重启数据库。最后修改密码命令以下:
mysql> use mysql; mysql> update user set password=password("123456") where user="root";
再删除刚刚添加的 skip-grant-tables 参数,再重启数据库,使用新密码便可登陆。
2)从新受权,命令以下:
mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';
问题分析:链接数超出 Mysql 的最大链接限制。
解决方法:
二、临时修改最大链接数,重启后不生效。须要在 my.cnf 里面修改配置文件,下次重启生效。
set GLOBAL max_connections=10000;
问题分析:MySQL 的配置文件/etc/my.cnf 权限不对。
解决方法:
chmod 644 /et/my.cnf
问题分析:innodb 数据文件损坏。
解决方法:修改 my.cnf 配置文件,在[mysqld]下添加 innodb_force_recovery=4, 启动数据库后备份数据文件,而后去掉该参数,利用备份文件恢复数据。
问题分析:主库和从库的 server-id 值同样.
解决方法:修改从库的 server-id 的值,修改成和主库不同,比主库低。修改完后重启,再同步便可!
问题分析:形成从库线程为 NO 的缘由会有不少,主要缘由是主键冲突或者主库删除或更新数据, 从库找不到记录,数据被修改致使。一般状态码报错有 100七、103二、106二、1452 等。
解决方法一:
mysql> stop slave; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave;
解决方法二:设置用户权限,设置从库只读权限
set global read_only=true; 8.Error initializing relay log position: I/O error reading the header from the binary log
分析问题:从库的中继日志 relay-bin 损坏.
解决方法:手工修复,从新找到同步的 binlog 和 pos 点,而后从新同步便可。
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;
维护过MySQL的运维或DBA都知道,常常会遇到的一些错误信息中有一些相似10xx的代码。
Replicate_Wild_Ignore_Table: Last_Errno: 1032 Last_Error: Could not execute Update_rows event on table xuanzhi.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000004, end_log_pos 3704
可是,若是不深究或者以前遇到过,还真不太清楚,这些代码具体的含义是什么?这也给咱们排错形成了必定的阻碍。
因此,今天民工哥就把主从同步过程当中一些常见的错误代码,它的具体说明给你们整理出来了:建议收藏备查!MySQL 常见错误代码说明
1.库名、表名、字段名必须使用小写字母,并采用下划线分割。
2.库名、表名、字段名禁止超过32个字符。
3.使用INNODB存储引擎。
4.库名、表名、字段名禁止使用MySQL保留字。
5.禁止使用分区表。
6.建议使用UNSIGNED存储非负数值。
7.建议使用INT UNSIGNED存储IPV4。
例如:
SELECT INET_ATON('209.207.224.40'); 3520061480SELECT INET_NTOA(3520061480); 209.207.224.40
8.强烈建议使用TINYINT来代替ENUM类型。
9.使用VARBINARY存储大小写敏感的变长字符串或二进制内容。
10.INT类型固定占用4字节存储
11.区分使用DATETIME和TIMESTAMP。
如何使用TIMESTAMP的自动赋值属性?
a)自动初始化,并且自动更新: column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP b)只是自动初始化: column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP c)自动更新,初始化的值为0: column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP d)初始化的值为0: column1 TIMESTAMP DEFAULT 0
12.索引字段均定义为NOT NULL。
详细的可参阅如下文章
学好知识,固然就得去面试,进大厂,拿高薪。可是进入面试以前,必要的准备是必须的,刷题是其中之一。
如下内容主要受众为开发人员,因此不涉及到MySQL的服务部署等操做,且内容较多,你们准备好耐心和瓜子矿泉水.
前一阵系统的学习了一下MySQL,也有一些实际操做经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题本身也回答很差,虽然知识点大部分都知道,可是没法将知识串联起来.
所以决定搞一个MySQL灵魂100问,试着用回答问题的方式,让本身对知识点的理解更加深刻一点.
此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员须要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案.