一、创建用户
create user 'xy104'@'192..168.42.24' identified by '123456';
xy104:用户名
localhost;这个权限最高的root用户
%:任务ip地址
192.168.42.24:登录的IP地址
identified by ‘123456’:指定该用户的密码
mysql -h 192.168.42.24 -u xy104 -p123456
#在命令行远程登录数据库
二、赋权和解除权限
grant:用于授予用户对数据库对象的访问权限
all:所有,增删改查所有命令
grant select,insert on xyjy.* to 'xy104'@'192.168.42.24';
#赋予xyjy数据库内的xy104用户查询和增加的权限
删除权限
revoke:删除权限
revoke delete on xyjy.* from 'xy104'@'192.168.42.24';
#删除xyjy数据库内的xy104用户的权限
三、删除用户
drop user 'xy104'@'192.168.42.24';
#删除xy104用户
修改密码
vim /etc/my.cnf
skip-grant-table
#免密登录
保存退出
mysql -u root -p
update user set authentication_string = '' where user='root';
selsct host,user,authentication_string,plugin from user;
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
四、删除表内数据
删除表内数据,到那时保留表名和表的结构
方法1:
delete from 表名;
如果该表有自增长的字段,delete删除之后,会保留之前的自增长记录
方法2:
truncate table 表名
全部清空,自增长记录也会从1开始
五、mysql的索引
索引在所有的关系型数据库当中的都有,索引是一个排序的列表,在这个列表当中存储了索引的值和这个值对应数据所在的物理地址。
使用了索引之后,查询数据表时,可以不用全表扫描来定义数据所在行。
可以通过索引直接找到该行数据对应的物理地址,直接访问数据,提高查询的速度,合理的设置索引可以提高数据库查询速度,也是必备的一项操作
索引的作用
索引的好处
1、索引就相当于书本的目录,当表很大(数据量多)或者查询涉及到多个表时(不超过3个),使用索引可以提高成千上万倍的查询速度
2、可以降低数据库的l/o成本,索引也会降低数据库的排序成本
3、也可以创建唯一性索引
4、可以加快表与表之间的连接速度
5、使用索引可以减少分组和排序的时间
6、通过索引可以提高数据库的恢复速度
索引的副作用
1、索引也需要占用磁盘的空间
2、更新一个有索引的表比更新没有索引的表时间更长,因为索引也需要更新
索引的创建原则
索引的创建原则:
虽然索引可以提高访问速度,但是也不是任何情况下都需要索引
在有索引的情况下,数据库会先查索引然后再定位到数据行
索引的设置如果不合理,反而会增加数据库的负担
1、表的主键和外键必须有索引,但是主键和外键默认就是索引
2、超过300行的表数据,就需要添加索引
3、和其他表连接的字段,要建立索引
4、唯一性差的字段,不适合设置索引
5、字段更新频繁,不适合索引
6、经常出现在where条件的字段当中的,尤其是大表,应该建立索引
7、在经常进行group by和order by ,要创建索引
索引的类型
mysql的索引默认就是B-TREE索引
叶子节点上包含的条目直接指向到数据行,叶子节点之间也互相连接,形成了一个向下延伸的指针
根据索引值一步一步定位到数据行
哈希索引:它是把索引值转换成值,通过对应索引的hash值找到对应数据行
索引的创建
主键索引:创建了主键默认就是索引
explain select * from member (name(5));
普通索引
create index name_index on member (name(5));
#name(5):列名当中匹配的长度,在不损失精确性的情况下,长度越小越好,减少索引文件的大小create table if not exists xy104 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50),
index name_index (name)
);唯一索引,该字段的值必须是唯一的,胆识可以为空,天价唯一约束,自动就是唯一索引
create table if not exists xy104 (
id int(4) zerofill primary key ,
name varchar(10) unique key,
cardid int(18) ,
hobby varchar(50),
);create unique index name_index on member (name(5));组合索引:可以是单字段的索引,也可以是多字段的组合
要满足最左原则,select的查询语句的where条件,是从左往右执行的,字段的组合要符合索引的排序
create table if not exists xy104 (
id int(4) zerofill primary key ,
name varchar(10) unique key,
cardid int(18) ,
hobby varchar(50),
unique index cardid phone address (cardid, phone, address)
);alter table member4 add constraint uc_cardid_phone_address unique (cardid ,phone,address )全文索引:适合使用模糊查询进行匹配时使用,用来检索文章当中的信息
create fulltext index remark——index on members(remark)
#创建索引
select * from member3 where match(remark) against(‘第八集’)
索引:
主键索引 创建了主键默认就是索引
普通索引 最常见的一种索引方式
唯一索引: 创建唯一约束就是唯一索引,唯一索引的值可以是null
组合索引: 多个字段结合起来成为共同。
全文索引: 大文本的匹配。
match---->列 against------>文本
六、mysql的事务和存储引擎
mysql innodb自带了事务的特性
原子性
一致性
隔离性
持久性
隔离性
隔离性:每个事务执行的过程时独立的,互相不能被干扰,并发事务之间是独立的
1、脏读
A事务在访问数据并且修改了数据,但是修改的结果没有提交到数据库,
B事务也访问了这条数据,而且看到了未提交的结果。
2、不可重复读: 在一个事务之内,多次读同一数据。
这A事务没有结束时,另一个B事务也访问该数据,由于在A事务中两次读取数据,在中间B事务修改了数据,
导致A事务两次查询的结果是不一致的,这就是不可重复读,不能读到相同的数据。
3、幻读:A事务对数据进行了修改,B事务也对数据进行了修改,A事务发现数据还是没有修改的数据,产生了幻觉。
事物的隔离级别
mysql支持事务四种隔离级别:
1、未提交读,允许脏读,可以看到未提交的修改 read uncimmitted
2、提交读,read committed提交读,只允许看到修改提交之后的数据
begin 显示开始一个事务
update cost set money=150 where id =1
commit 提交 事务,所有的修改都是永久性
3、可重复读,mysql默认隔离级别,一个事务在执行两次select语句,保证得到相同的结果
update cost set money=150 where id =1
4、串行读,后一个事务必须等待前一个完成之后才能继续,在这个过程中表会完全锁住,读写都活阻塞
事务的控制语句
begin:显示开始一个事务
commit:提交事务,所有的修改都是永久性
rollback:对事务进行回滚,返回到上一次的操作,只能回滚正在进行未提交的修改
savepoint:在事务当中创建一个回滚点,回滚到指定的位置,一个事务中可以有多个回滚点。
savepoint在一个事务当中是一个临时的标记,在事务执行过程中的一个回滚点,多个回滚点,是按照顺序进行的,
前面的回滚点一旦执行,后续的回滚点就回失效。
七、行锁和死锁
innodb的行锁和死锁
行锁
innodb通过给索引加锁来实现行级的锁定,如果没有索引,会使用隐藏的聚簇索引来实施实现锁定
如果A事务对索引字段进行操作,就会触发聚簇索引,锁定整行,B事务对这个行进行的操作都会被锁住
死锁
两个事务相互等待对方的资源,形成了一个环路导致的
for update:设置一个排他锁,在当前事务未提交前,禁止事务的写入和更新操作
死锁发生会自动选择一个事务当中的语句进行执行,直接终止其中的一个事务,回滚另外一个事务,以解除死锁
如何避免死锁的发生
1、按照固定的顺序对表和行进行访问
2、大事务拆成小事务,业务允许的情况下
3、调整事务的默认隔离级别,如果业务允许,隔离级别越低越好
4、要给表添加合适的索引(不是经常需要访问的字段,最好不要设置索引。)
八、mysql的备份和还原以及日志管理
备份的目的就是灾难恢复
数据库备份的分类:
1、物理备份
冷备份:关闭数据库进行备份的,全量备份
2、逻辑备份***
热备份:数据库可以正常运行,不影响数据库的操作,在这个条件可以实现备份和恢复
备份策略:
全量备份
增量备份
冷备份只能进行全量备份,逻辑备份既可以实现全量,也可以实现增量
mysqldump,常用的逻辑备份的工具,mysql自带的。
全量备份,物理冷备份:
tar -jcvf /opt/mysql_all_$(date+%F).tar.xz /usr/local/mysql/data
把mysql的date目录,打包的格式.xz,保存到opt的目录下
mysqldump的备份和恢复
mysqldump是针对库和表的全量和增量,使用的是热备份
把备份的库和表,以文件的形式导出,再从导出的文件进行恢复
mysqldump -u root -p123456 --databases xyjy > /opt/xyjy.sql
--databases:指定库
把xyjy库备份到/opt/xyjy.sql目录下
mysql -u root -p123456 < /opt/xyjy.sql
把xyjy库重新导入到mysql数据库
mysqldump -u root -p123456 xyjy cost > /opt/xyjy.sql
把xyjy库中的cost表备份到/opt/xyjy.sql
mysql -u root -p123456 xyjy < /opt/xyjy.sql
把表恢复到指定库中
直接在命令行输入命令
对于数据的备份和恢复***
热备份
使用mysql的二进制日志的方式进行备份,对数据的全量或者是增量
基于位置的恢复
基于时间点的恢复
打开/etc/my.cnf
先要剋期二进制日志的功能
log-bin=mysql-bin
开启二进制日志的功能,二进制文件的名称mysql-bin.000001
binlog_format=MIXED
二进制日志的记录格式
log-error=/usr/local/mysql/data/mysql-error.log
#记录mysql在启动,停止或者是运行时,产生错误的日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#开启mysql在使用过程中的记录日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
#开启慢查询日志,用来记录所有查询的时间超过long_query_time=5的记录,查询的执行时间超过5秒钟就会记录。
不注明,默认10秒
vim /etc/my.cnflog-bin=mysql-binbinlog_format=MIXEDlog-error=/usr/local/mysql/data/mysql-error.loggeneral_log=ONgeneral_log_file=/usr/local/mysql/data/mysql_general.logslow_query_log=ONslow_query_log_file=/usr/local/mysql/data/mysql_slow_query.loglong_query_time=5
二进制日志的记录格式:
1、ROW 基于行
记录每一行的数据,准确,但是恢复效率低
2、STATEMENT 基于sql语句
按照顺序对sql语句进行记录,高并发的情况下,sql的记录有可能会出错,可能会导致数据的记录有偏差,虽然恢复的效率比较高
3、MIXED 混合
正常情况下使用STATEMENT,高并发自动切换ROW的记录方式
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001可以解读二进制日志mysql-bin.000001进行解析
mysqlbinlog --no-defaults mysql-bin.000001 |mysql -u root -p 123456
恢复增量
mysqladmin -u root -p123456 flush-logs
刷新,打断点
我们是按天来执行的,我们就可以按天对数据库进行增量的备份
mysqlbinlog --no-defaults --start-position=‘1338’ mysql-bin.000005 | mysql -u root -p123456
这个命令从指定的位置(位置1338)开始恢复数据,一直恢复到文件的结尾。
mysqlbinlog --no-defaults --stop-position=‘1338’ mysql-bin.000005 | mysql -u root -p123456
这个命令从文件的开始位置恢复数据,直到指定的结束位置(位置1338)
从指定位置开始到指定位置结束
mysqlbinlog --no-defaults --start -position=‘2364’ --stop-position=‘3235’ mysql-bin.000001 | mysql -u root -p123456
从指定时间开始到指定时间结束
mysqlbinlog --no-defaults --start -datetime=‘2024-12-20 13:47:17’ --stop-datetime=‘2024-12-20 13:47:38’ mysql-bin.000001 | mysql -u root -p123456