数据库-用户管理

一、创建用户

c 复制代码
create user 'xy104'@'192..168.42.24' identified by '123456';

xy104:用户名

localhost;这个权限最高的root用户

%:任务ip地址

192.168.42.24:登录的IP地址

identified by '123456':指定该用户的密码

c 复制代码
mysql -h 192.168.42.24 -u xy104 -p123456
#在命令行远程登录数据库

二、赋权和解除权限

grant:用于授予用户对数据库对象的访问权限

all:所有,增删改查所有命令

c 复制代码
grant select,insert on xyjy.* to 'xy104'@'192.168.42.24';
#赋予xyjy数据库内的xy104用户查询和增加的权限

删除权限

revoke:删除权限

c 复制代码
revoke delete on xyjy.* from 'xy104'@'192.168.42.24';
#删除xyjy数据库内的xy104用户的权限

三、删除用户

c 复制代码
drop user 'xy104'@'192.168.42.24';
#删除xy104用户

修改密码

c 复制代码
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值找到对应数据行

索引的创建

c 复制代码
主键索引:创建了主键默认就是索引
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的备份和恢复

c 复制代码
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秒

c 复制代码
vim /etc/my.cnf
	log-bin=mysql-bin
	binlog_format=MIXED
	log-error=/usr/local/mysql/data/mysql-error.log
	general_log=ON
	general_log_file=/usr/local/mysql/data/mysql_general.log
	slow_query_log=ON
	slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
	long_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

相关推荐
success_a23 分钟前
大故障:阿里云核心域名爆炸了
数据库·阿里云·云计算
@小红花3 小时前
MySQL数据库从0到1
数据库·mysql·oracle
[听得时光枕水眠]3 小时前
MySQL基础(三)DQL(Data Query Language,数据查询语言)
数据库·mysql·oracle
我科绝伦(Huanhuan Zhou)3 小时前
深入解析Oracle SQL调优健康检查工具(SQLHC):从原理到实战优化
数据库·sql·oracle
doublelixin4 小时前
AOSP (Android11) 集成Google GMS三件套
android
xzkyd outpaper7 小时前
onSaveInstanceState() 和 ViewModel 在数据保存能力差异
android·计算机八股
寒山李白7 小时前
MySQL安装与配置详细讲解
数据库·mysql·配置安装
文牧之8 小时前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql
CYRUS STUDIO8 小时前
FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
android·安全·逆向·app加固·fart·脱壳
deriva8 小时前
某水表量每15分钟一报,然后某天示数清0了,重新报示值了 ,如何写sql 计算每日水量
数据库·sql