数据库基础之04(存储引擎,密码修改,用户授权,权限撤销,数据备份恢复,增量备份恢复)

目录

1、 mysql存储引擎

1-1、什么是存储引擎

1-2、常用存储引擎的特点(myisam   innodb)

1-3、事务(Transactions):一次sql操作从建立连接到操作完成断开连接的访问过程称作事务。

1-4、事务的特点:  ACID

2、修改管数据库理员root本机登录密码(操作系统管理员有权限修改)

2-1、修改密码

2-2、恢复数据管理员root本机登录密码(操作系统管理员有权限恢复)

3、用户授权

3-1、授权举例

4、权限撤销 (删除新添加用户的访问权限)

5、 数据备份与恢复 (DBA )

5-1、物理备份: 备份库和表对应系统文件

5-2、逻辑备份:

5-3、备份数据和数据恢复:

5-4、完全恢复:mysql

6、增量备份与恢复:

6-1、binlog日志的使用:

6-2、查看日志内容

6-3、日志记录sql命令格式

6-4执行日志文件记录的sql命令恢复数据

6-5、手动生成新的日志文件的四种方法:

6-6、删除已有的日志文件


1、 mysql存储引擎


1-1、什么是存储引擎

存储引擎是Mysql数据库服务自带功能程序,处理表的处理器。每种存储引擎有不同的功能和数据存储方式。

查看当前的数据库服务,支持的存储引擎
mysql> show  engines;

修改数据库服务默认使用的存储引擎
]# systemctl  stop  mysqld
]# vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
:wq
]# systemctl  start  mysqld

mysql> show  engines;

建表时指定表使用的存储引擎
create table   t2  (id int) engine=存储引擎名;
create table   t2  (id int) engine=memory;
create table   t3  (id int) engine=innodb;

修改表使用的存储引擎
alter  table  表名  engine=存储引擎名;


查看表使用的存储引擎
show  crate  table  表名;

1-2、常用存储引擎的特点(myisam   innodb)

myisam 存储引擎特点

  • 支持表级锁  (客户端连接数据库服务器后,对表的数据做访问时,若表的存储引擎是myisam的话,会给整张表加锁)
  • 不支持事务和事务回滚

每个表对应3个表文件

  • 表.frm    表结构数据      desc  表
  • 表.MYD  表数据
  • 表.MYI   表的index索引信息   

InnoDB的特点

  • 支持行级锁(客户端连接数据库服务器后,对表的数据做访问时,若表的存储引擎是innodb的话,会只给表中被访问的行加锁)
  • 支持外键、事务和事务回滚   

锁类型:

  • 读锁(共享锁)  当对一张表执行查询(select)操作时 会加读锁
  • 写锁(排他锁或互斥锁) 当对一张表执行写(insert update  delete)操作时 会加写锁

每个表对应2个表文件  

  • 表.frm  表结构数据
  • 表.ibd   表数据和index索引

为了帮助大家更好的区分读写锁和(表级锁行级锁),我将读写锁叫做权限锁(决定了加锁后用户有哪些操作权限),将表级锁行级锁叫做对象索(决定将锁加在某一行还是整张表)。

此外值得注意的是:

众多资料中都说innodb使用的是行级锁,但实际上是有限制的。只有在你增删改查时匹配的条件字段带有索引时,innodb才会使用行级锁,在你增删改查时匹配的条件字段不带有索引时,innodb使用的将是表级锁。因为当你匹配条件字段不带有所引时,数据库会全表查询,所以这需要将整张表加锁,才能保证查询匹配的正确性。在生产环境中我们往往需要满足多人同时对一张表进行增删改查,所以就需要使用行级锁,所以这个时候一定要记住为匹配条件字段加索引。

提到行级锁和表级锁时我们就很容易联想到读锁和写锁,因为只有触发了读写锁,我们才会谈是进行行级锁定还是进行表级锁定。那么什么时候触发读锁,就是在你用select 命令时触发读锁,什么时候触发写锁,就是在你使用update,delete,insert时触发写锁,并且使用rollback或commit后解除本次锁定。

1-3、事务(Transactions):一次sql操作从建立连接到操作完成断开连接的访问过程称作事务。

支持事务的可以做事务回滚 :一次sql操作有任意一步没有执行成功会恢复所有操作。(对innodb存储引擎的表 访问时 必须任意一步操作都成功,才能完成操作。)

事务操作比如: 银行的汇款或转账业务

插卡  --->输入密码 --->登录成功
转账    卡号   XXXXXX
          金额   50000
                                           确定
           转账成功   -50000    +50000
                                            退卡

innodb存储引擎的表有对应的事务文件记录所有SQL命令
cd /var/lib/mysql/
ibdata1
ib_logfile0
ib_logfile1


mysql> set  autocommit=off;
mysql> show  variables  like "autocommit"; 
commit ;  手动提交
rollback;  回滚操作

1-4、事务的特点:  ACID

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

1 .原子性 

事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 

2 .一致性 

事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

3 .隔离性 

一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 

4 .持续性 

也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。 

总结:

工作中建表时,如何决定表使用的存储引擎

  • 执行查询操作多的表适合使用myisam存储引擎,节省系统资源。
  • 执行写操作多的表适合使用innodb存储引擎,这样并发访问量大。

     


2、修改管数据库理员root本机登录密码(操作系统管理员有权限修改)

2-1、修改密码

mysqladmin  -hlocalhost -uroot  -p   password  "新密码"

[root@host50 ~]# 
mysqladmin  -hlocalhost -uroot -p password   "123qqq...A"
Enter password:    当前登录密码


2-2、恢复数据管理员root本机登录密码(操作系统管理员有权限恢复)

]# systemctl  stop  mysqld
]#  vim /etc/my.cnf
[mysqld]
skip_grant_tables-----取消权限设置,即再没有权限限制
:wq
]# systemctl  start  mysqld
]# mysql
mysql> 
select  host,user,authentication_string from mysql.user;

mysql> update  mysql.user   set  authentication_string=password("123456")  where  user="root"  and  host="localhost";

mysql> flush privileges;

mysql> quit;

flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。MySQL用户数据和权限有修改后,希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。通常是在修改ROOT帐号的设置后,怕重启后无法再登录进来,那么直接flush之后就可以看权限设置是否生效。而不必冒太大风险。


3、用户授权

 在数据库服务器上添加新的连接用户名,默认只有数据库管理员root用户在数据库服务器本机登录有授权权限。默认情况下管理员只能从数据库本机连接服务,再没有其他用户能够连接数据库服务器了。

授权命令格式:
]# mysql  -uroot  -p123456
mysql>
grant    权限列表  on   数据库名  to  用户名@" 客户端地址"   
identified   by   "密码"   [ with  grant option];


with  grant option  可选, 让添加的用户连接服务器后,也有授权权限。
identified   by   "密码"   新添加的用户连接数据库服务器时,使用的密码

客户端地址  作用:网络中的那些主机可以使用新添加的用户连接数据库服务器。有如下表示方式:

  • 所有主机    %
  • 网段  192.168.4.%
  • 指定主机   192.168.4.51
  • 本机         localhost
  • 主机名    pc1.tedu.cn  
  • 域名   %.tedu.cn

用户名   客户端主机连接数据库服务器时使用的名字,授权时自定义既可,名字要有标识性。

数据库名 : 新添加的连接用户,访问后可以操作的库,表示方式如下:

  • *.*             所有库 所有表
  • 库名.*        库下的所有表
  • 库名.表明   某张表

权限列表 : 新添加的连接用户,对可以操作的库的访问权限,权限的表示方式如下:

  • all   所有权限
  • 命令  某种权限   (例如  select , insert ,delete) 

授权库 mysql 库记录授权信息,使用不同的表记录不同的授权信息

  • user ---- 记录已经添加的连接所有用户名
  • db--------仅记录已添加的连接用户对库的访问权限
  • tables_priv------- 仅记录已--添加的连接用户对表的访问权限
  • columns_priv----- 仅记录已添加的连接用户对表字段的访问权限
  • desc  user;
  • desc db;
  • desc tables_priv;
  • desc    columns_priv;
  • select  *  from  user\G;
  • select  *  from  db;
  • select  *  from  tables_priv;
  • select  * from  columns_priv;

select user  from mysql.user;
select user,host from mysql.user;-------可以查看给哪些用户用什么主机登陆的权力


show grants  for  用户@"客户端地址";---------查看授权用户的访问权限 

show grants  for  root@"localhost";
select  * from user where  user="root" and  host="localhost"\G;


3-1、授权举例


在50服务器上添加用户admin
mysql> grant  select,insert  on  db3.*   to  admin@"192.168.4.%"  identified  by  "123qqq...A";

mysql> select user  from mysql.user where user="admin"; 

在客户端51使用服务新添加的用户连接主机50 验证例子1 授权
]# mysql -h192.168.4.50 -uadmin  -p123qqq...A
mysql> select @@hostname;---------查看当前登陆的数据库是哪个数据库
mysql> select user();-----查看当前登录的用户名
mysql> show  grants;-----查看被授予的权限
mysql> 执行sql命令验证权限

授权例子2
在50服务器 授权主机52 可以使用root 连接自己,对所有库表有完全权限且有授权权限 登录密码是123qqq...A

grant  all  on   *.*   to   root@"192.168.4.52"   identified  by  "123qqq...A"   with  grant  option;

在客户端使用服务新添加的用户连接主机50 验证例子2 授权
[root@host52 ~]# mysql  -h192.168.4.50  -uroot  -p123qqq...A
mysql> select @@hostname;
mysql> select user();
mysql> show  grants;
mysql> 测试对库表的访问权限
mysql>  grant  select,update(name,uid)  on  db3.user  to  webuser@"%"  identified by "123qqq...A";  #测试授权权限

在客户端使用有授权权限用户 添加用户连接数据库服务器50
]#  mysql  -h192.168.4.50  -uwebuser  -p123qqq...A
mysql> show  grants;
mysql> 测试访问权限

在50主机上查看授权信息
select  user,host from mysql.user;
select  * from  mysql.db \G;
select  * from  mysql.tables_priv \G;
select  * from  mysql.columns_priv \G;


4、权限撤销 (删除新添加用户的访问权限)


4-1、MySQL> revoke  权限  on  数据库名   from  用户名@"客户端地址";

select user,host  from mysql.user;
show  grants  for  root@"192.168.4.52";

revoke   grant option  on  *.*  from  root@"192.168.4.52";
show  grants  for  root@"192.168.4.52";

select  *  from  mysql.user where  user="root" and  host="192.168.4.52"\G;

4-2、修改记录的方式 撤销用户的权限
mysql> update  mysql.user  set   Delete_priv="N" where  user="root" and  host="192.168.4.52";
MySQL>flush  privileges;


select  *  from  mysql.user where  user="root" and  host="192.168.4.52"\G;

revoke  all  on  *.*   from  root@"192.168.4.52";
show  grants  for  root@"192.168.4.52";


4-3、删除授权用户 (删除添加的连接用户)
mysql> drop   user   用户名@"客户端地址";
mysql> drop   user   root@"192.168.4.52";


SELECT, INSERT, UPDATE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE 


4-4、修改密码:


授权用户连接数据库服务器后修改连接密码
mysql> set  password=password("新密码");

管理员重置授权用户的连接密码
mysql> set password for 用户名@"客户端地址"=password("新密码");
 

5、 数据备份与恢复 (DBA )


5-1、物理备份: 备份库和表对应系统文件


50:
cp  -r  /var/lib/mysql     /dbdir.bak
cp  -r  /var/lib/mysql/mysql    /mysqldb.bak
cp  -r  /var/lib/mysql/mysql/db.*   /root/ 
tar  zcvf   /mysql.tar.gz  /var/lib/mysql/*  

scp    -r   /mysqldb.bak   192.168.4.51:/root/

恢复   把备份的文件拷贝会对应的数据库目录,把所有者和组修改为mysql  重启数据库服务器。
51:
systemctl  stop  mysqld
rm  -rf /var/lib/mysql/mysql
cp -r  /root/mysqldb.bak   /var/lib/mysql/mysql
chown  -R  mysql:mysql  /var/lib/mysql/mysql
systemctl  start  mysqld

5-2、逻辑备份:

  •  执行备份命令时,根据备份的库表 生产对应的sql命令,把命令保存到指定的文件里。恢复时,执行保存sql命令的备份文件 把数据写回数据库里。
  • 数据备份策略

完全备份   备份所有数据(通常包括3类对象: 一张表里的所有数据   一个库的所有表    一台数据库服务器的所有数据)

只备份新产生的数据:
差异备份: 备份自完全备份,后所有新产生的数据
增量备份: 备份上次备份后,所有新产生的数据


完全+差异
完全+增量 *

工作中使用crond服务 执行备份脚本(在备份脚本调用备份命令)做数据备份

00  23   *  *  1      /root/allbak.sh
00  23   *  *  2-7 /root/newbak.sh
++++++++++++++++++++++++++++++

5-3、备份数据和数据恢复:

完全备份:mysqldum 
]# man  mysqldump
]# mysqldump   -uroot   -p123456   库名  > 目录名 /文件名.sql

库名的表示方式:
--all-databases  或  -A   所有库所有表

  • 库名     备份库下的所有表
  • 库名 表名      备份一张的所有记录
  • -B 库名1  库名2    备份某几个库的所有数据

5-4、完全恢复:mysql

  1. ]#mysql  -uroot  -p123456    库名  <  目录名 /文件名.sql-------这里的库名可以和原库名一样也可以不一样
  2. mysql>  source   目录名 /文件名.sql-------恢复到当下目录位置

]# mkdir  /bakdir
]# mysqldump -uroot -p123456  -A  > /bakdir/alldb.sql

]# mysqldump -uroot -p123456  db3  > /bakdir/db3.sql

]# mysqldump -uroot -p123456  db3 user > /bakdir/db3-user.sql

]# mysqldump -uroot -p123456  -B db3 db55 > /bakdir/twodb.sql


50:
mysql> drop  table db3.user;
mysql> select  * from db3.user;
]# mysql  -uroot -p123456   db3  <  /bakdir/db3-user.sql


mysql> drop  database  db3;
mysql>  create  database  db3;
]#  mysql  -uroot -p123456   db3  <  /bakdir/db3.sql

总结:备份数据库    mysqldump   -uroot   -p123456   库名  > 目录名 /文件名.sql

库名的表示方式:
--all-databases  或  -A   所有库所有表

  • 库名     备份库下的所有表
  • 库名 表名      备份一张的所有记录
  • -B 库名1  库名2    备份某几个库的所有数据

恢复数据库: 

mysql -uroot -p123456 < 完全备份.sql

mysql -uroot -p123456  新建的库(库名可以与原库名相同也可不同) < 1到多个库备份.sql

mysql -uroot -p123456     库名(可以是新建库,也可以是当前已有的库)<表备份.sql

注意:

  • mysqldump   备份和恢复会锁表

vim /bakdir/db3-user.sql
lock  tables   user   write
insert  into  

案例:每周一  23点备份数据库服务器上db3库下的所有表到系统的/bakdir目录。

]# vim  /root/alldb3.sh
#!/bin/bash
if [ ! -e  /bakdir ];then
   mkdir   /bakdir
fi       
x=`date  +%F`
mysqldump   -uroot  -p123456  db3   >  /bakdir/db3_${x}.sql  
:wq

]#chmod  +x  /root/alldb3.sh 

]# /root/alldb3.sh 
]# ls  /bakdir

]# crontab  -e
00  23  * *  1    /root/alldb3.sh      &>  /dev/null
:wq

6、增量备份与恢复:

  • 启用MySQL服务自带的binlog日志 文件

6-1、binlog日志的使用:

日志介绍:是服务日志文件中的一种(默认没有启用) 记录除查询之外的sql命令.
select     show tables   desc   show  databases---------  查
insert   update   delete-------- 写

启用日志
[mysqld]
server_id=50
log-bin--------启用binlog日志
binlog-format="mixed"

host50-bin.000001    日志文件   > 500M
host50-bin.index       索引文件-----记录已有日志文件名


6-2、查看日志内容

]# mysqlbinlog    host50-bin.000001 


自定义binlog日志名称及存储目录
[root@host50 ~]# mkdir /logdir
[root@host50 ~]# chown  mysql  /logdir/----一定要将新建的目录所属者改为mysql,才能被mysqld程序调用

vim /etc/my.cnf
[mysqld]
log-bin=/logdir/db50-----定义了日志文件不再储存在/var/log/mysql下,
而是存储在/logdir下,并且定义了日志文件名前缀为db50

:wq

]#  systemctl  restart   mysqld

]# mysqlbinlog   /logdir/db50.000001

6-3、日志记录sql命令格式

偏移量   
时间点

]# mysqlbinlog 选项  /logdir/db50.000001

--start-position=数字
--stop-position=数字

--start-datetime="yyyy-mm-dd  hh:mm:ss"
--stop-datetime="yyyy-mm-dd  hh:mm:ss"

6-4执行日志文件记录的sql命令恢复数据

]# mysqlbinlog 选项  日志文件名   |  mysql  -uroot -p123456


]#  mysqlbinlog   --start-position=616   --stop-position=794  /logdir/db50.000001  |  mysql  -uroot -p123456
  
 


]#  mysqlbinlog   --start-datetime="2018-07-17 14:21:15"   
--stop-datetime="2018-07-17 14:21:18"  /logdir/db50.000001  |  mysql  -uroot -p123456
  

mysql> show master status; 查看正在使用的日志信息


6-5、手动生成新的日志文件的四种方法:

  1. ]# systemctl  restart mysqld
  2. ]# mysql -uroot -p123456  -e "flush logs"
  3. mysql> flush logs;
  4. ]# mysqldump  -uroot  -p123456  --flush-logs  db3  >  /bakdir/db3.sql

6-6、删除已有的日志文件

mysql>  purge  master  logs  to  "db50.000005";------删除000001--000005的的所有binglog日志文件
mysql> reset  master;-----------功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。用于第一次进行搭建主从库时,进行主库binlog初始化工作;
]#rm  -rf /logdir/*

猜你喜欢

转载自blog.csdn.net/Perfect11_1/article/details/81229587