目录
1-3、事务(Transactions):一次sql操作从建立连接到操作完成断开连接的访问过程称作事务。
2、修改管数据库理员root本机登录密码(操作系统管理员有权限修改)
2-2、恢复数据管理员root本机登录密码(操作系统管理员有权限恢复)
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
- ]#mysql -uroot -p123456 库名 < 目录名 /文件名.sql-------这里的库名可以和原库名一样也可以不一样
- 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、手动生成新的日志文件的四种方法:
- ]# systemctl restart mysqld
- ]# mysql -uroot -p123456 -e "flush logs"
- mysql> flush logs;
- ]# 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/*