MySQL数据库
V5.7.27端口3306
生产环境常用数据库
关系型数据库有 Oracle Microsoft SQL Server MySQL/MariaDB等。
非关系型数据库有 MongoDB Memcached Redis
关系型数据库:
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系数据库
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
Mysql数据库事务的特性
原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,事务要么成功,要么撤回.具有不可再分的特征一样。事务是应用中不可再分的最小执行体。(最小了,不可再分了)
一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态比如:当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。
隔离性:当涉及到多用户操作同一张表时,数据库会为每一个用户开启一个事务。各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不相互影响。(说白了,就是你做你的,我做我的!)
持续性:持续性也称为持久性指事务一旦提交对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。即使数据库崩溃了,我们也要保证事务的完整性。
mysql的优化
1.数据库设计与规划--以后再修该很麻烦,估计数据量,使用什么存储引擎<br /> 2.数据的应用--怎样取数据,sql语句的优化<br /> 3.mysql服务优化--内存的使用,磁盘的使用<br /> 4.操作系统的优化--内核<br /> 5.升级硬件设备<br /> 6.创建索引提升查询速度
MySQL安全
避免从互联网访问MySQL数据库,确保特定主机拥有访问权
设置root用户口令并改其登陆名
禁用loca data infile命令(默认关闭此命令可使普通用户批量导入数据)
禁用MySQL_history(历史操作)
降低系统特权、降低用户特权
移除匿名和废弃账户
移除测试数据库
定期备份
Mysql数据库引擎
InnoDB存储引擎
InnoDB是事务型数据库的首选(默认)引擎,支持事务安全表(ACID),支持行锁定;
特点: 支持事务处理,支持崩溃修复和并发控制。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交和回滚。
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
特点: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。但是对应用的完整性、并发性要求比较低。
MEMORY内存型引擎
数据库的数据类型
其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。
1.整数类型
根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。
2.浮点数类型和定点数类型
在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。而定点数类型只有一种即DECIMAL类型。
3.字符串类型
在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。
4.长字符串类型
5.日期与时间类型
MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。
5.1 YEAR类型
YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型 的值。
5.2 TIME类型
TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中,HH表示小时, MM表示分,SS表示秒。
5.3 DATETIME类型
DATETIME类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。
5.4 TIMESTAMP类型
TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。
数据库、数据表的基本操作
1.数据库的基本操作
创建一个数据库
create database 数据库名称;
创建一个叫db1的数据库
create database db1;
查看创建的数据库
show databases db1;
删除数据库
drop database db1;
查看所有数据库
show databases;
修改数据库的字符集
alter database db1 character set gbk;
切换到用户
use db1;
查看当前使用的库
select database();
2.数据表的基本操作
创建数据表
create table student(id int,name varchar(20),gender varchar(10),birthday date);
查看数据表
show tables;
查看表的基本信息
show create table student;
查看表字段信息
desc student;
修改表名
alter table student rename to zlp(新表名);
修改字段名
alter table zlp change name sname varchar(10);
修改字段数据类型
alter table zlp modify sname int;
增加字段
alter table zlp add address varchar(50);
删除字段
alter table zlp drop address;
删除数据表
drop table 表名;
数据表插入数据
1. 为表中所有字段插入数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
2. 为表中指定字段插入数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
3. 同时插入多条记录
INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
更新数据
1. UPDATE基本语法
UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
2. UPDATE更新部分数据
update student set age=20,gender='female' where name='tom';
3. UPDATE更新全部数据
update student set age=18;
删除数据
1. DELETE基本语法
DELETE FROM 表名 [WHERE 条件表达式];
2. DELETE删除部分数据
delete from student where age=14;
3. DELETE删除全部数据
delete from student;
MySQL数据表简单查询
1.简单查询概述:简单查询即不含where的select语句。在此,我们讲解简单查询中最常用的两种查询:查询所有字段和查询指定字段。
2.查询所有字段(方法不唯一只是举例)
select * from student;
3.查询指定字段(sid、sname)
select sid,sname from student;
4.常数的查询
select sid,sname,'2021-03-02' from student;
5.从查询结果中过滤重复数据
select distinct gender from student;
6.算术运算符(举例加运算符)
select sname,age+10 from student;
函数
在开发中,我们常常有类似的需求:统计某个字段的最大值、最小值、 平均值等等。为此,MySQL中提供了聚合函数来实现这些功能。所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。
1.1、count()统计表中数据的行数或者统计指定列其值不为NULL的数据个数
select count(*) from student;
1.2、max()计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算
select max(age) from student;
1.3、min()计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算
select sname,min(age) from student;
1.4、sum()计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0
select sum(age) from student;
1.5、avg()计算指定列的平均值,如果指定列类型不是数值类型则计算结果为
select avg(age) from student;
条件查询
数据库中存有大量数据,我们可根据需求获取指定的数据。此时,我们可在查询语句中通过WHERE子句指定查询条件对查询结果进行过滤。
1.使用关系运算符查询
2.使用IN关键字查询
IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。
select * from student where sid in ('表1','表2');
3.使用BETWEEN AND关键字查询
BETWEEN AND用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内,则将所在的记录将查询出来。
select * from student where age between 数值1 and 数值2;
4.使用空值查询
在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串。
select * from student where sname is not null;
5.使用AND关键字查询
在MySQL中可使用AND关键字可以连接两个或者多个查询条件。
select * from student where age>15 and gender='male';
6.使用OR关键字查询
在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来
select * from student where age>15 or gender='male';
7.使用LIKE关键字查询
MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配
7.1 普通字符串
select * from student where sname like 'wang';
7.2 含有%通配的字符串 %用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串
select * from student where sname like 'li%';
7.3 含有_通配的字符串 下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。
select * from student where sname like 'zx__';
8.使用LIMIT限制查询结果的数量
当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条
限制年龄在3岁
select * from student order by age asc limit 3;
9.使用GROUP BY进行分组查询
GROUP BY 子句可像切蛋糕一样将表中的数据进行分组,再进行查询等操作。换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。
10.使用ORDER BY对查询结果排序
从表中査询出来的数据可能是无序的或者其排列顺序不是我们期望的。为此,我们可以使用ORDER BY对查询结果进行排序
升序排列
select * from student order by age asc;
表的关联关系
在实际开发中数据表之间存在着各种关联关系。在此,介绍MySQL中数据表的三种关联关系。
多对一
多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。在多对一的表关系 中,应将外键建在多的一方否则会造成数据的冗余。
多对多
多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。
一对一
在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。
1.关联查询
2.关于关联关系的删除数据
多表连接查询
1.交叉连接查询
概念:当在查询时,所需要的数据不在一张表中,可能在两张表或多张表中。此时需要同时操作这些表。即关联查询。
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积;比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接,其语法格式如下:
SELECT * FROM 表1 CROSS JOIN 表2;
2.内连接查询
内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的 记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。在做多张表查询时,这些表中应该存在着有关联的两个字段,组合成一条记录。只连接匹配到的行,只显示表中有匹配的数据。
SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段
3.外连接查询
在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。外连接又分为左(外)连接和右(外)连接。
SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件
外连接:在做多张表查询时,所需要的数据,除了满足关联条件的数据外,还有不满足关联条件的数据。此时需要使用外连接.外连接分为三种
左外连接:表A left [outer] join 表B on 关联条件,表A是主表,表B是从表
右外连接:表A right [outer] join 表B on 关联条件,表B是主表,表A是从表
全外连接:表A full [outer] join 表B on 关联条件,两张表的数据不管满不满足条件,都做显示。
1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。
2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。
3.1 左(外)连接查询
左(外)连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及所有满足连接条件的记录。
3.2 右(外)连接查询
右(外)连接的结果包括RIGHT JOIN子句中指定的右表的所有记录,以及所有满足连接条件的记录。
子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。
1.带比较运算符的子查询
比较运算符前面我们提到过得,就是>、<、=、>=、<=、!=等
2.带EXISTS关键字的子查询
EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行
3.带ANY关键字的子查询
ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。
4.带ALL关键字的子查询
ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。
主从同步
配置mysql主从同步前,如何保证主库与从库的数据一致
从库配置高于主库,因为从库压力可能比较大,而且还得及时将主库的数据同步过来。
开启多线程复制
主库快速dll执行
或者 架构调整 使用MGR集群模式使用组复制
主从原理
主库开启i/0线程
从库生成2个线程,一个i/0线程,一个SQL线程
主从同步就是异步复制过程,主库曾、删、改时候生成二进制日志
从库i/0线程去请求主库binLog日志,并把binlog日志写到relaylog中继日志
SQL线程会读取relay log文件中的日志并解析成重做操作,将sql语句写入从库来实现主从的操作一致,而最终数据一致
mysql服务器的主从配置
主mysql服务器上配置:
1)必须启用binlog日志
2)必须指定自己的server_id值
3)授权一个连接用户可以在从服务器上来连接主服务器有拷贝数据的权限
4)主mysql服务器和从mysql服务器的表结构要一致(内容可以不同)
5)根据情况决定是否开启级联复制功能
从mysql服务器上配置:
1)必须指定server_id值
2)启用binlog日志(可以不启用,但一般也启用)
3)主mysql服务器和从mysql服务器的表结构要一致(内容可以不同)
4)根据情况决定是否开启级联复制功能
注意:如果表结构不一致,可以通过在主服务器上把数据完全备份后,再传给从服务器,再在从服务器上把传过来的文件恢复到从服务器的数据库中,表结构就一致了。
主从复制延迟问题
从节点过多
主服务器配置高,从服务器的配置低。
并发量大导致主服务器读的慢。从服务器写的慢
网络延迟比较高
从服务器的读写速度慢
自增键不一致
max_allowed_packer设置不一致:如果主库的max_allowed_packer设置大于从库,可能导致在主库可以执行的sql在从库无法执行。
解决方法:
半同步复制—解决数据丢失的问题用来解决主库数据丢失问题;semi-sync 复制,指的就是主库写入 binlog 日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的 relay log 之后,接着会返回一个 ack 给主库,主库接收到至少一个从库的 ack 之后才会认为写操作完成了。
并行复制—-解决从库复制延迟的问题
用来解决主从同步延时问题。从库开启多个线程,并行读取 relay log 中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。
主从master宕机的切换
1)从节点登录master账户
mysql> stop slave;
mysql> reset master;
2)查看是否只读模式:show variables like ‘read_only’;
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
3)查看show slave status \G;
4)在程序中将原来主库IP地址改为现在的从库IP地址,测试应用连接是否正常
读写分离
MySQL 主从复制原理的是啥?
其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。主库将变更写入 binlog 日志,然后从库连接到主库之后,从库有一个 IO 线程,将主库的 binlog 日志拷贝到自己本地,写入一个 relay 中继日志中。接着从库中有一个 SQL 线程会从中继日志读取 binlog,然后执行 binlog 日志中的内容,也就是在自己本地再次执行一遍 SQL,这样就可以保证自己跟主库的数据是一样的。
这里有一个非常重要的一点,就是从库同步主库数据的过程是串行化的,也就是说主库上并行的操作,在从库上会串行执行。所以这就是一个非常重要的点了,由于从库从主库拷贝日志以及串行执行 SQL 的特点,在高并发场景下,从库的数据一定会比主库慢一些,是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。
mysql数据库查询慢排查方法
1).没有索引或没有用到索引。
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表 的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。
2).IO吞吐量小形成了瓶颈
PS:这是从系统层来分析MYSQL是比较耗IO的。一般数据库监控也是比较关注IO。
监控命令:$iostat -d -k 1 10
参数-d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次
3).内存不足
监控内存使用:vmstat [-n] [延时[次数]]
free: 空闲的物理内存
buff: 作为buffer cache的内存,对块设备的读写进行缓冲
cache: 作为page cache的内存, 对读的缓冲
4).网络速度慢
ping IP -t 查看是否有丢包。
5).一次查询的数据量过大
比如没有分页查询,一次提取上万条记录。数据库有可能卡死。
6).出现死锁
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
解决死锁:#show innodb status检查引擎状态 ,可以看到哪些语句产生死锁。
#执行show processlist找到死锁线程号.然后kill -9 进程号
主从复制的常见不同步问题
1)从mysql服务器的IO进程的出错(为no)和解决方法:
连接不上主数据服务器时(一般是网络上问题包括ping不通或授权不成功)
解决方法:
在主服务起上重新授权,并show master status;查看相关的值。
在从服务器上先stop slave,并用change master to 选项=值,……等把信息修改成和主服务器的值一致即可,并检查是否ping通。
2)从mysql服务器的SQL出错(为no)和解决方法:
从mysql数据库的库和表结构与主mysql数据库服务器的不一致。
解决方法:
把主mysql服务器上的库和表备份成sql语句文件,scp给从mysql服务器,再在从mysql服务器上恢复到从mysql服务器里,这样就表结构就一致了
mysql的数据库的隔离性的级别
读未提交,读提交,串行化,不可重复读
Mysql数据库索引的应用?
普通索引(INDEX):索引列值可重复
唯一索引(UNIQUE):索引列值必须唯一,可以为NULL
主键索引(PRIMARY KEY):索引列值必须唯一,不能为NULL,一个表只能有一个主键索引
全文索引(FULL TEXT):给每个字段创建索引
·MySQL备份和恢复
物理备份: 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
1、热备(hot backup)
在线备份,数据库处于运行状态,这种备份方法依赖于数据库的日志文件
- 对应用基本无影响(但是性能还是会有下降,所以尽量不要在主上做备份,在从库上做)
2、冷备(cold backup)
备份数据文件,需要停机,是在关闭数据库的时候进行的
- 备份 datadir 目录下的所有文件
3、温备(warm backup)
- 针对myisam的备份(myisam不支持热备),备份时候实例只读不可写,数据库锁定表格(不可写入但可读)的状态下进行的
- 对应用影响很大
- 通常加一个读锁
1.完全备份——-完整备份:
每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。
优点:备份与恢复操作简单方便,恢复时一次恢复到位,恢复速度快
缺点:占用空间大,备份速度慢
2.增量备份: 每次备份上一次备份到现在产生的新数据
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化.
特点:因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份起按备份时间顺序,逐个备份版本进行恢复,恢复时间长,如中间某次的备份数据损坏,将导致数据的丢失。
3.差异备份:只备份跟完整备份不一样的
备份那些自从第一次次完全备份之后被修改过的所有文件,备份的时间起点是从第一次的完整备份起,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。备份数据量会越来越大。
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。
逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库,效率相对较低。
物理和逻辑备份的区别
| | 逻辑备份 | 物理备份
| ————— | ——————————————— | ———————————
| 备份方式 | 备份数据库建表、建库、插入sql语句 | 备份数据库物理文件
| 优点 | 备份文件相对较小,只备份表中的数据与结构 | 恢复速度比较快
| 缺点 | 恢复速度较慢(需要重建索引,存储过程等) | 备份文件相对较大(备份表空间,包含数据与索引)
| 对业务影响 | I/O负载加大 | I/O负载加大
| 代表工具 | mysqldump | ibbackup、xtrabackup,mysqlbackup
备份方式:物理备份,逻辑备份 bin-log日志
物理备份: tar 打包压缩数据库文件:tar -cvzf db.tar /usr/local/mysqld/data #数据存放目录
快照
xtrabackup: 完整备份:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。
差异备份 :占用和速度居中,可以恢复到指定时间的备份
增量备份:备份体积小,备份速度 快,恢复时间长,恢复时,将增量备份的文件叠加到上一次备份上,在恢复
逻辑备份:mysqldump
远程备份语法: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
本地备份语法: # mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
bin-log日志:日志需要一开始就在开启状态,查看bin-log日志只需要找到开始和结束位置就行
其他
SQL
优点
1、简单易学,具有很强的操作性
2、绝大多数重要的数据库管理系统均支持SQL
3、高度非过程化;用SQL操作数据库时大部分的工作由DBMS自动完成
分类
1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELEC[
](https://blog.csdn.net/Iperishing/article/details/87549720)
数据表的约束
1.主键约束
主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。每张表里只能有一个主键,不能为空,而且唯一,主键保证记录的唯一性,主键自动为NOT NULL。
字段名 数据类型 primary key;
2.非空约束
非空约束即 NOT NULL指的是字段的值不能为空。
字段名 数据类型 NOT NULL;
3.默认值约束
默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值。
字段名 数据类型 DEFAULT 默认值;
5.唯一性约束
唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现.
字段名 数据类型 UNIQUE;
6.外键约束
外键约束即FOREIGN KEY常用于多张表之间的约束。
-- 在创建数据表时语法如下:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
-- 将创建数据表创号后语法如下:
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
6.1 数据一致性概念
建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。
6.2 删除外键
alter table 从表名 drop foreign key 外键名;
6.3 关于外键约束需要注意的细节
1、从表里的外键通常为主表的主键
2、从表里外键的数据类型必须与主表中主键的数据类型一致
3、主表发生变化时应注意主表与从表的数据一致性问题
别名设置
在査询数据时可为表和字段取別名,该别名代替表和字段的原名参与查询操作。
1.为表取别名
在查询操作时,假若表名很长使用起来就不太方便,此时可为表取一个別名,用该别名来代替表的名称。
SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;
2.为字段取别名
在查询操作时,假若字段名很长使用起来就不太方便,此时可该字段取一个別名,用该别名来代替字段的名称。
SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;
[
](https://blog.csdn.net/Iperishing/article/details/87549720)
mysql睡眠连接(sleep线程)过多,会对mysql服务器造成什么影响?
严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。
造成睡眠连接过多的原因?
1).使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)
2).程序中,没有及时关闭mysql连接
3).数据库查询不够优化,过度耗时。
解决思路:
1).程序中,不使用持久链接,即使用mysql_connect而不是pconnect。
2).程序执行完毕,应该显式调用mysql_close
3).只能逐步分析系统的SQL查询,找到查询过慢的SQL,优化之
mysql多实例
简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。
这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件(也可以相同)、启动程序(也可以相同)、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务[
](https://blog.csdn.net/Iperishing/article/details/87549720)
