数据库分类
简述关系型数据库和菲关系型数据库:https://www.jianshu.com/p/fd7b422d5f93
数据库排名:https://db-engines.com/en/ranking
1.定义
采用了关系模型来组织数据的数据库
2.常用概念
3.关系型数据库优点
4.关系型数据库瓶颈
5.特性
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
数据库事务必须具备ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。
数据库事务的4大特性ACID
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
读写实时性
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后才看到这条动态是完全可以接受的
复杂SQL,特别是多表关联查询
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品阶级角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能极大的弱化了
6.事务的隔离级别
隔离级别:https://blog.csdn.net/dengjili/article/details/82468576
脏读
不可重复读
虚读(幻读)
7.Mysql体系结构
体系结构:https://blog.csdn.net/q402057192/article/details/87689739
可以看出MySQL最上层是连接组件。下面服务器是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。
注:lex和yacc
yacc是一个语法分析程序的自动产生器,严格地说Lex也是一个形式语言的语法分析程序的自动产生器。不过Lex所能处理的语言仅限于正规语言,而高级语言的词法结构恰好可用正规式表示,因此Lex只是一个词法分析程序的产生器。yace可以处理能用LALR(1)文法表示的上下文无关语言。而且我们将会看到yace具有一定的解决语法的二义性的功能。
具体:可以看《lex与yacc》这一本书
8.MySQL内存结构
MySQL中内存大致分为:全局内存(Global buffer)、线程内存(Thread buffer) 两大部分。
全局内存:缓冲池里面有数据缓存、索引缓存、锁信息、插入缓存等等。此外还有重做日志缓存、额外的内存池。
线程内存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。
CheckPoint技术:缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟。因此更新或者删除的时候直接操作的是内存的数据,先写入重做日志,然后再修改内存池里面的数据,最后定时刷新到磁盘上。
9.MySQL文件结构
(1) 参数文件:启动MySQL实例的时候,指定一些初始化参数,比如:缓冲池大小、数据库文件路径、用户名密码等。
(2) 日志文件:比如:错误日志、二进制日志、慢查询日志、查询日志等等。
通过show variables like "error_log"来查看错误日志存放内容。
通过show variables like "long_query_time"来查看慢查询日志记录的阈值。默认的慢查询日志的阀值是10秒,也就是查询时长超过10秒就会记录到慢查询日志文件;
(3) socket文件:当用UNIX域套接字方式进行连接的时候需要的文件。
(4) pid文件:MySQL实例的进程ID文件。
(5) 表结构文件:用来存放MySQL表结构定义文件。
.frm后缀命名的文件都是表结构文件,和存储引擎类型无关。所有的表都会生成一个.frm文件;
(6) 存储引擎文件:存储引擎正在存储了记录和索引等数据。
10.InnoDB表存储结构
11.MySQL存储引擎
存储引擎
区别
1、事务的支持不同
innodb支持事务
myisam不支持事务
2、锁粒度
innodb行锁
myisam表锁
3、存储空间
innodb既缓存索引文件又缓存数据文件
myisam只能缓存索引文件
4、存储结构
(myisam:数据文件的扩展名为.MYD myData ,索引文件的扩展名是.MYI myIndex)
(innodb:所有的表都保存在同一个数据文件里面 即为.Ibd)
5、统计记录行数
(myisam:保存有表的总行数,select count() from table;会直接取出出该值)
(innodb:没有保存表的总行数,select count() from table;就会遍历整个表,消耗相当大)
mysql的存储引擎包括:MyISAM、 InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。
特点 | MYISAM | BDB | MEMORY | INNODB | ARCHIVE |
---|---|---|---|---|---|
存储限制 | 没有 | 没有 | 有 | 64TB | 没有 |
事务安全 | 支持 | 支持 | |||
锁机制 | 表锁 | 页锁 | 表锁 | 行锁 | 行锁 |
B树索引 | 支持 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | |||
索引缓存 | 支持 | 支持 | 支持 | ||
数据可压缩 | 支持 | 支持 | |||
空间使用 | 低 | 低 | N/A | 高 | 非常低 |
内存使用 | 低 | 低 | 中等 | 高 | 低 |
批量插入的速度 | 高 | 高 | 高 | 高 | 非常高 |
支持外键 | 支持 |
四种重要的非关系型数据库
非关系数据库:https://www.cnblogs.com/ynyhl/p/9253025.html
1.Hbase
列式存储以流的方式在列中存储所有的数据。对于任何记录,索引都可以快速地获取列上的数据;列式存储支持行检索,但这需要从每个列获取匹配的列值,并重新组成行。HBase(Hadoop Database)是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase是Google BigTable的开源实现,模仿并提供了基于Google文件系统的BigTable数据库的所有功能。HBase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥HBase处理大数据量等功能,需要使用Hadoop作为文件系统。HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务,主要用来存储非结构化和半结构化的松散数据。
Hbase中表的特点:大,稀疏,面向列
Hbase应用场景:抓取增量数据、内容服务、信息交换
2.Redis
Redis是一个key-value存储系统,key为字符串类型,只能通过key对value进行操作,支持的数据类型包括string、list、set、zset(有序集合)和hash。Redis支持主从同步,数据可以从主服务器向任意数量的从服务器上同步。
Redis事务允许一组命令在单一步骤中执行。事务有两个属性:在一个事务中的所有命令作为单个独立的操作顺序执行;Redis事务是原子的,原子意味着要么所有的命令都执行,要么都不执行。Redis 事务由指令 MULTI 发起的,之后传递需要在事务中和整个事务中,最后由 EXEC 命令执行所有命令的列表。
Redis应用场景:统计
3.MongodDB
一个基于分布式文件存储的开源数据库系统,为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key value)对组成。
MongodDB特点:面向集合存储,易存储对象类型的数据;模式自由;支持动态查询;支持完全索引,包含内部对象;支持查询;支持复制和故障恢复;使用高效的二进制数据存储,包括大型对象(如视频);自动处理碎片,以支持云计算层次的扩展性;支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言;文件存储格式为BSON(一种JSON的扩展);可通过网络访问。
MongodDB应用场景:网站数据;缓存;大尺寸,低价值的数据;高伸缩性的场景;用于对象及JSON 数据的存储。
4.Neo4j
一个高性能的 NoSQL 图形数据库,把数据保存为图中的节点以及节点之间的关系。Neo4j 中两个最基本的概念是节点和边节点表示实体,边则表示实体之间的关系。节点和边都可以有自己的属性,不同实体通过各种不同的关系关联起来,形成复杂的对象图。
Neo4j 提供了在对象图上进行查找和遍历的功能:深度搜索、广度搜索。
Neo4j特点:完整的ACID支持;高可用性;轻易扩展到上亿级别的节点和关系;通过遍历工具高速检索数据;属性是由Key-Value键值对组成。
Neo4j应用场景:社交网络,歌曲信息,状态图
1.非关系型数据库不需要表与表之间有联系。
2.非关系型数据库对事务没有需求,不需要严格的保证数据的一致性。
3.非关系型数据库追求的是高并发,高扩展性。
数据库 类型 | 特性 | 优点 | 缺点 |
---|---|---|---|
关系型数据库 SQLite、Oracle、mysql | 1、关系型数据库,是指采用了关系模型来组织 数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型, 而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 | 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 | 1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写; |
非关系型数据库 MongoDb、redis、HBase | 1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 | 1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 | 1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好; |
mysql主流分支:https://blog.csdn.net/xuheng8600/article/details/79947595
产品 | 价格 | 目标 | 主要功能 | 是否可投入生产? |
---|---|---|---|---|
Percona Server | 免费 | 提供 XtraDB 存储引擎的包装器和其他分析工具 | XtraDB | 是 |
MariaDB | 免费 | 扩展 MySQL 以包含 XtraDB 和其他性能改进 | XtraDB | 是 |
Drizzle | 免费 | 提供比 MySQL 更强大的可扩展性和性能改进 | 高可用性 | 是 |
1.Drizzle
Drizzle是MySQL引擎的一次重大修改,它清除了一些表现不佳和不必要的功能,将很多代码重写,对它们进行了优化,甚至将所用语言从C换成了C++,以获得所需的代码。此外,Drizzle 并没有就此结束修改,该产品在设计时就考虑到了其目标市场,即具有大量内容的多核服务器、运行Linux的64位机器、云计算中使用的服务器、托管网站的服务器和每分钟接收数以万计点击率的服务器。
2.MARIABD
与Percona产品非常类似,但是提供了更多底层代码更改,试图提供比标准 MySQL更多的性能改进。MariaDB直接利用来自Percona的XtraDB引擎,由于它们使用的是完全相同的引擎,因此每次使用存储引擎时没有显著的差别。此外,MariaDB提供了MySQL提供的标准存储引擎,即MyISAM和InnoDB。
与内置的MySQL存储引擎相比,XtraDB提供了一些极大的改进,
可扩展性:处理更多事务;在强大的服务器上进行扩展
性能:使用了XtraDB的Percona Server速度非常快
可靠性:避免损坏,提供崩溃安全(crash-safe)复制
管理:在线备份,在线表格导入/导出
诊断:高级分析和检测
灵活性:可变的页面大小,改进的缓冲池管理
索引进阶:https://blog.csdn.net/q402057192/article/details/87695498
1.索引是什么?有什么作用?
索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B_TREE及其变种。索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
2.索引的优缺点
优点:
缺点:
时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度;
空间方面:索引需要占物理空间。
3.为什么说B+tree比B 树更适合实际应用中操作系统的文件索引和数据库索引
4.什么情况下设置了索引但无法使用?
以“%(表示任意0个或多个字符)”开头的LIKE语句,模糊匹配;
OR语句前后没有同时使用索引;
数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型);
对于多列索引,必须满足 最左匹配原则 (eg:多列索引col1、col2和col3,则 索引生效的情形包括 col1或col1,col2或col1,col2,col3)
5.什么样的字段适合创建索引?
6.创建索引时需要注意什么?
1.锁的类型:
2.锁的粒度:
3.锁的实现:
4.什么是死锁?怎么解决?
死锁:两个或多个事务相互占用了对方的锁,就会一直处于等待锁的状态。
常见的解决死锁的方法:
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务处理不好可以用分布式事务锁或者使用乐观锁
安装依赖
1.登录ftp服务器下载lnmp_src目录
0.清除yum安装的mysql-server
yum remove mysql-server mysql
rm -rf /var/lib/mysql /etc/my.cnf
yum install gcc gcc-c++ automake ncurses-devel
2.编译安装cmake
lftp 172.16.200.251
mirror lnmp_src
3.编译mysql
[root@lnmp source]# tar -xzvf mysql-5.6.17.tar.gz
[root@lnmp source]# cd mysql-5.6.17
[root@lnmp mysql-5.6.17]# cmake -DCMAKE_INTSALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/data/mysql -DENABLE_DOWNLOADS=1
[root@lnmp mysql-5.6.17]# make && make install
4.初始化mysql
拷贝服务控制脚本
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
进入安装目录
cd /usr/local/mysql
修改数据目录和安装目录拥有者和所属组
chown -R mysql.mysql /usr/local/mysql /data/mysql
运行初始化脚本(为了数据库初始化)
/usr/local/mysql/scripts/mysql_install_db
5.启动mysql服务
/etc/init.d/mysqld restart
1.创建用户
[root@mysql ~]# useradd -r -s /sbin/nologin mysql
2.数据库目录创建
[root@mysql ~]# mkdir /data
[root@mysql ~]# mkdir /data/mysql/mysql3306/{data,logs,tmp} -p
[root@mysql ~]# chown -R mysql.mysql /data/mysql/mysql3306
查看
[root@mysql ~]# ll /data/mysql/mysql3306/
total 12
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 data
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 logs
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 tmp
3.软件的基本安装
下载
mysql 8.0
[root@mysql ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
mysql 5.7
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
解压
[root@mysql ~]#mv ~/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz /opt/mysql8.0/
[root@mysql ~]# cd /opt/mysql8.0/
[root@mysql mysql8.0]#tar -xf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
[root@mysql ~]#cd /usr/local/
[root@mysql local]# ln -s /opt/mysql8.0/mysql-8.0.20-linux-glibc2.12-x86_64 mysql
4.配置文件准备
/etc/my.cnf
[client]
socket = /data/mysql/mysql3306/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /data/mysql/mysql3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
log-error = /data/mysql/mysql3306/logs/err.log
pid-file = /data/mysql/mysql3306/logs/mysql.pid
#log_slave_updates = 1
#log-bin = /data/mysql/3308/mysql-bin
配置文件加载顺序(每个文件若存在都会加载,新配置覆盖旧配置)
5.初始化MySQL
[root@mysql ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql
报错,下载libaio, yum install -y libaio-devel.x86_64
查看
[root@mysql local]# ll /data/mysql/mysql3306/
total 16
drwxr-xr-x 6 mysql mysql 4096 Jun 23 11:54 data
drwxr-xr-x 2 mysql mysql 4096 Jun 23 11:54 logs
srwxrwxrwx 1 mysql mysql 0 Jun 23 11:54 mysql.sock
-rw------- 1 mysql mysql 5 Jun 23 11:54 mysql.sock.lock
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 tmp
6.检查error log初始化是不是正常
tailf /data/mysql/mysql3306/logs/mysql-error.log
7.启动mysql服务
[root@mysql local]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
[1] 1413
[root@mysql local]# tail /data/mysql/mysql3306/logs/mysql.pid
1413
# 该日志下有随机密码 A temporary password is generated for root@localhost: Y#et)OR9RPgU
[root@mysql local]# tail /data/mysql/mysql3306/logs/err.log
2020-06-23T15:54:57.089118Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.20' socket: '/data/mysql/mysql3306/mysql.sock' port: 3306 MySQL Community Server - GPL.
[root@mysql local]# mysql -u root -p
-bash: mysql: command not found
[root@mysql local]# /usr/local/mysql/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.20
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
# 修改密码
mysql> alter user user() identified by '123';
Query OK, 0 rows affected (0.01 sec)
service mysqld restart
systemctl restart mysqld
mysqld_safe --defaults-file=/etc/my.cnf &
添加服务
[root@mysql local]# cp -v /usr/local/mysql/support-files/mysql.server /etc/init.d/
‘/usr/local/mysql/support-files/mysql.server’ -> ‘/etc/init.d/mysql.server’
[root@mysql local]# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQLD
SourcePath=/etc/init.d/mysql
Before=shutdown.target
[Service]
User=mysql
Type=forking
ExecStart=/etc/init.d/mysql.server start
ExecReload=/etc/init.d/mysql.server restart
ExecStop=/etc/init.d/mysql.server stop
[Install]
WantedBy=multi-user.target
加入变量
export PATH=/usr/local/mysql/bin:$PATH
问题
生产环境应该使用哪一种方式启动,文件启动
生产环境要不要自动开机启动mysqld服务,最好不要
centos6
yum install mysql-server mysql
centos7
yum install mariadb-server mariadb
rpm | 二进制 | 源码 | |
---|---|---|---|
优点 | 安装简单,适合初学者学习使用 | 安装简单 可以安装在任何路径下,灵活性好 一台服务器可以安装多个mysql |
在实际安装的操作系统进行可根据需要定制编译,最灵活 性能最好 一台服务器可以安装多个mysql |
缺点 | 需要单独下载客户端和服务器 安装路径不灵活,默认路径不能修改,一台服务器只能安装一个mysql |
已经经过编译,性能不如源码编译的好 不能灵活定制编译参数 |
安装过程较复杂 编译时间长 |
文件布局 | /usr/bin 客户端程序和脚本 /usr/sbin mysqld 服务器 /var/lib/mysql 日志文件,数据库 /usr/share/doc/packag es 文档 /usr/include/mysql 包含(头)文件 /usr/lib/mysql 库 /usr/share/mysql 错误消息和字符集文件 /usr/share/sql-bench 基准程序 |
bin 客户端程序和 mysqld 服务器 data 日志文件,数据库 docs 文档,ChangeLog include 包含(头)文件 lib 库 scripts mysql_install_db share/mysql 错误消息文件 sql-bench 基准程序 |
bin 客户端程序和脚本 include/mysql 包含(头)文件 info Info 格式的文档 lib/mysql 库 libexec mysqld 服务器 share/mysql 错误消息文件 sql-bench 基准程序和crash-me 测试 var 数据库和日志文件 |
mysql -u root -h ‘localhost’ -p
mysql -u root -h ‘localhost’ -p -U
mysql -u root -h ‘localhost’ -e “语句” -p;
交互模式语句
show XXX;
show databases;
show tables;
SQL语句;
select * from TB_NAME;
use DB;
切换到数据库DB
system COMMAND
执行shell中的命令
source *.sql
执行*.sql文件中的SQL语句
show create database DB_NAME;
查看建库语句
show create table TB_NAME;
查看建表语句
show variables;
查看mysql的所有内置变量
show variables like ‘character%’;
查看character开头的变量
set global VAR_NAME=VALUE;
修改变量的值
show character set;
查看所有字符集及校对规则
show status;
查看当前会话的状态
show global status; #全局的状态
show processlist;
查看mysql的连接情况
show full processlist; 完整的信息包括执行的语句
批处理模式 mysql -uroot -p < test.sql
管理mysql服务器的接口(建库,删库,创建用户,开停服务)
mysqladmin [options] command [command-arg] [command [command-arg]] …
options 同mysql选项
第一种
SET PASSWORD FOR root@localhost =‘newpass’;
mysql> SET PASSWORD FOR root@localhost ='newpass';
Query OK, 0 rows affected (0.04 sec)
第二种
mysqladmin -u root password “newpass” -p
[root@mysql ~]# /usr/local/mysql/bin/mysqladmin -u root password "123456" -p
Enter password:
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
第三种
直接修改表
mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;
重载权限表
第四种
mysql初始化向导
mysql_secure_installation
[root@mysql ~]# /usr/local/mysql/bin/mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Using existing password for root.
Estimated strength of the password: 25
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y
New password:
Re-enter new password:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
丢失root密码的情况
停止mysqld服务
mysqld_safe --skip-grant-tables &
mysql -u root mysql
use mysql
mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=‘root’;
mysql> FLUSH PRIVILEGES;
以上是5.7之前的版本,现在用的是8.0的版本,所以是有区别的。
mysql 8.0版本忘记密码:https://www.cnblogs.com/yaowen/p/9486997.html
实战
[root@mysql ~]# systemctl stop mysql
[root@mysql ~]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
[1] 907
[root@mysql ~]# 2020-06-30T12:51:29.519830Z mysqld_safe Logging to '/data/mysql/mysql3306/logs/err.log'.
2020-06-30T12:51:29.579482Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/mysql3306/data
/usr/local/mysql/bin/mysql -u root mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.20 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mysql
Database changed
mysql> update user set authentication_string = ' ' where user = 'root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
完成
登录进去修改密码
直接回车就行
[root@mysql ~]# /usr/local/mysql/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.20 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SET PASSWORD FOR root@localhost ='Newpass@123';
Query OK, 0 rows affected (0.01 sec)
mysqld_safe
启动mysql服务端进程
mysqldump
备份数据库
mysqlbinlog
解析mysql的binlog日志
用于创建、删除、修改新库和新表,为表加入索引等
create
创建数据库
create database 数据库名(不能数字开头)
举例
创建表
create table 表名 (字段名1 类型 其他,字段名2 类型 其他,…)
举例
create database pldb;
use pldb
create table student(id int(4) not null,name char(20) not null,age tinyint(2) not null default '0',dept varchar(16) default null);
show create database pldb;
show create table student;
desc 表名;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.217.153
Master_User: master
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1370
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 322
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
创建用户
create user ‘alice’@‘localhost’ identified by ‘pass’;
查看表结构
desc 表名;
为表中字段创建索引
说明
创建主键索引&普通索引
每个表只能有一个主键索引列(内容唯一),可以有多个普通索引列(内容可以不唯一)
create table student(
-> id int(4) not null auto_increment,auto_increment 自增
-> name char(20) not null,
-> age tinyint(2) not null default '0',
-> dept varchar(16) default null
-> primary key(id), 主键索引
-> key index_name(name),
-> );
key index_name(name),
普通索引格式: 索引名称(列名)
添加普通索引 alter table student add index index_name(name);
对字段前n个字符创建索引 create index index_dept on student(dept(8));
为表的多个字段创建联合索引 create index index_name_dept on student(name,age);create index index_name_dept on student(name(8),dept(5));
联合索引的生效特性
组合索引的生效原则是 从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用
例子:index(a,b,c) 对a,b,c做联合索引
where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关
查看索引 show index from student;
删除索引 drop index 索引名 on 表名;
常见问题
drop
alter
增删表的字段
alter table 表名 add 字段 类型 其他;first;after
举例
alter table student add sex char(6);
增加一个字段
alter table student add sex char(4),add qq int(20);
增加两个字段
alter table student change qq mail char(10);
改变字段
alter table student modify mail char(20);
修改字段类型
修改表名
rename table 原表 to 新表;
insert
insert into student(column_name,…) values(VALUE,…)
举例
insert into student values(4,'ponce',22,'CS');
不指定列的话值需要一一对应
insert into student(name) values('alice');
插入一行数据
insert into student(name) values('alice'),('bob');
插入多行数据
update
update 表名 set name=value where EXPRESSION;
举例
update student set name='gemi' where id=4;
delete
删除表中数据
delete from 表名 [where EXP];
truncate table 表名; 直接清空表内容
select
select 列名 from 表名 [where|limit|order by …];
举例
select user,password from user;
select * from user where user=‘haha’;
select * from user where user=‘haha’ and id=2;
select * from user where id>2;
select id,name from student where name='jack' or id=4;
select id,name from student limit 2;
select * from student order by id asc|desc;
explain 查询语句
数据控制语言,授权和撤权
grant
revoke
show variables like ‘character%’;
character_set_client | latin1
客户端编码方式
character_set_connection | latin1
建立连接使用的编码
character_set_results | latin1
结果集的编码;
character_set_database | latin1
数据库的编码
character_set_filesystem | binary
os上文件名转化成此字符集,默认binary是不做任何转换的
character_set_server | latin1
数据库服务器的编码
character_set_system | utf8
元数据的编码
查看:
mysql> show variables like 'character%';
+--------------------------+-------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql8.0/mysql-8.0.20-linux-glibc2.12-x86_64/share/charsets/ |
+--------------------------+-------------------------------------------------------------------+
8 rows in set (0.02 sec)
1.可以通过set names utf8; 修改(在查询插入数据时设置或在sql文件中指定)
2.mysql -u root -p --deafult-character-set=utf8 pldb< xx.sql
3.修改my.cnf
[mysql]
default-character-set=utf8;
mysql客户端字符集
[mysqld]
character_set_server=utf8
mysql服务器字符集
1.导出表结构
mysqldump -uroot -p --default-character-set=latin1 -d DBNAME > X1.sql
-d 只备份表结构
–default-character-set=latin1 连接默认的字符集为latin1
[root@mysql ~]# /usr/local/mysql/bin/mysqldump -uroot -p --default-character-set=latin1 -d haha > test.sql
Enter password:
[root@mysql ~]# ls
anaconda-ks.cfg bashdb-5.0-1.1.2 L957-964TMP.html.gz
bashdb-4.4-0.94 bashdb-5.0-1.1.2.tar.gz test.sql
bashdb-4.4-0.94.tar.gz download
2.编辑test.sql将latin1改为utf8
ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
3.确保数据库没有数据写入,备份数据
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 DBNAME > X2.sql
--quick
一次一行检索数据并缓存
--no-create-info
不保存create语句
--extended-insert
讲多行insert语句合并为一行
--default-character-set=latin1
按原有字符集导出数据,不会导致导出中文乱码
[root@mysql ~]# /usr/local/mysql/bin/mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 haha > test2.sql
4.将test2.sql修改为set name utf8;
在最前面加入一行set names utf8;
5.建库
create database pldb default charset utf8;
mysql> create database hehedb default charset utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)
6.导入库表
mysql -uroot -p pldb < test.sql
mysql -uroot -p pldb < test2.sql
[root@mysql ~]# /usr/local/mysql/bin/mysql -uroot -p hehedb < test.sql
Enter password:
[root@mysql ~]# /usr/local/mysql/bin/mysql -uroot -p hehedb < test2.sql
Enter password:
7.将mysql客户端和服务器端字符集改为utf8
修改my.cnf
[mysql]
default-character-set=utf8;
mysql客户端字符集
[mysqld]
character_set_server=utf8
mysql服务器字符集
8.重启mysql服务
mysql> use hehedb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from student;
+----+-------+-----+------+
| id | name | age | dept |
+----+-------+-----+------+
| 1 | alice | 20 | CS |
| 2 | bob | 21 | CS |
+----+-------+-----+------+
2 rows in set (0.00 sec)
此时字符集已变成utf8
mysql> show variables like 'character%';
+--------------------------+-------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql8.0/mysql-8.0.20-linux-glibc2.12-x86_64/share/charsets/ |
+--------------------------+-------------------------------------------------------------------+
8 rows in set (0.00 sec)