管理事务处理
事务处理
事务处理可以用来维护数据库的完整性,他保证成批的MySQL操作要么安全执行,要么完全不执行;
关系数据库设计把数据存储在多个表中,使数据更容易操纵,维护和重用,不用深究如何以及为什么进行关系数据库设计,设计良好的数据库模式都是管理的;
事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果,利用事务处理,可以保证一组操作不会中途停止,它们作为整体执行,或者完全不执行,如果没有错误发生,整组语句提交给数据库表,如果发生错误,则进行回退,以恢复数据库到某个已知且安全的状态;
- 事务(transaction)指一组SQL语句
- 回退(rollback)指撤销指定SQL语句的过程
- 提交(commit)指将未存储的SQL语句结果写入数据库表
- 保留点(savepoint)指事务处理中设置的临时占位符(place-hoder),你可以对它发布回退(与回退整个事务处理不同)
控制事务处理
管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退;
MySQL使用下列语句来标识事务的开始:
START TRANSACTION
使用ROLLBACK
MySQL的ROLLBACK命令用来回退(撤销)MySQL语句:
SELECT *FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;
首先执行一条SELECT以显示该表不为空,然后开始一个事务处理,用一条DELETE语句删除ordertotals中的所有行,另一条SELECT语句验证ordertotals确定为空,这时用一条ROLLBACK语句回退START TRANSACTION之后的所有语句,最后一条SELECT语句显示该表不为空;
ROLLBACK只能在一个事务处理内使用
使用COMMIT
MySQL语句直接针对数据库表执行和编写的,这就是所谓的隐含提交,即提交操作是自动进行的;
在事务处理块中,提交不会隐含的进行,为进行明确的提交,使用COMMIT语句
START TRANSACTION;
DELECT FROM orderitems WHERE order_num = 20010;
DELECT FROM orders WHERE order_num = 20010;
COMMIT;
在这里会明确的进行提交,当COMMIT或ROLLBACK语句执行后,事务会自动关闭
使用保留点
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理,只能对于简单的事务处理,复杂的事物处理可能需要提交或回退
为了支持回退的部分事物处理,必须能在事务处理块中合适的位置放置占位符,这样,如果需要回退,可以回退到某个占位符;
占位符称为保留点,为了创建占位符,可使用SAVEPOINT语句;
在回退的时候也可以显示的写出来;
SAVEPOINT deletel;
ROLLBACK TO deletel;
更改默认的提交行为
默认的MySQL行为是自动提交所有更改,任何时候执行一条MySQL语句,该语句实际上都是针对表执行的,所做的更改都会立刻执行,为指示MySQL不自动提交更改,需要使用下面的语句
SET autocommit=0;
autocommit标志决定是否自动提交更改,不管有没有COMMIT语句,设置autocommit为0指示MySQL不自动提交更改;
全球化和本地化
字符集和校对顺序
数据库表用来存储和检索数据,不同的语言和字符集需要不同的方式来存储和检索,MySQL需要使用不同的字符集,适用不同的排序和检索数据的方法:
- 字符集为字母和符合的集合;
- 编码为某个字符集成员的内部表示;
- 校对为规定字符如何比较的指令;
使用字符集和校对顺序
MySQL支持众多字符集,为查看所支持的字符集完整列表,使用以下语句:
SHOW CHARACTER SET;
该语句显示所有可用的字符集以及每个字符集的描述和默认的校对
查看所支持校对的完整列表,使用以下语句:
SHOW COLLATION;
此语句显示所有可用的校对,以及适用的字符集;
通常系统管理字安装时定义一个默认的字符集和校对,也可以在创建数据库时,指定默认的字符集和校对,为了确定所用的字符集和校对,使用以下的语句:
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
字符集很少是服务器范围的设置,不同的表,甚至不同的列都可能需要不同的字符集,两者都可以在创建表时指定;
表指定字符集和校对,使用带子句的CREATE TABLE
CREATE TABLE mytable
(
columnn1 INT,
columnn2 VARCHAR(10)
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;
此语句创建一个包含两列的表,并且指定一个字符集和一个校对顺序;
这个例子中指定了CHARACTER SET个COLLATE两者,一般,MySQL确定使用什么样的字符集和校对:
- 如果使用指定CHARACTER SET和COLLATE两者,则使用这些值
- 如果只指定CHARACTER SET,则使用此字符集及其默认的校对
- 如果既不指定CHARACTER SET,也不指定COLLATE,则使用数据库默认
CREATE TABLE mytable
(
columnn1 INT,
columnn2 VARCHAR(10),
columnn3 VARCHAR(10) CHARACTER SET latinl COLLATE
latinl_general_ci
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;
整个表以及一个特定的列指定了CHARACTER SET和COLLATE
安全管理
MySQL服务器安全的基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少,用户不能对过多的数据具有过多的访问权,考虑以下:
- 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表
- 某些用户需要读表,但不需要更新表
- 允许用户添加数据,不允许他们删除数据
- 用户可能需要处理用户账号的权限,多数用户不需要
- 用户通过存储过程访问数据,但不允许直接访问数据
- 想根据用户登录的地点限制对某些功能的访问
需要给用户提供他们所需的访问权,仅提供他们所需的访问权,这就是访问控制
管理用户
MySQL用户账户和信息存储在名为MySQL的MySQL数据库中,不需要直接访问MySQL数据库和表,但有时需要直接访问,需要直接访问它的时机是在需要所有用户账户列表时:
USE mysql;
SELECT user FROM user;
mysql数据库有应该名为user的表,包含所有用户账户,user表中有一个名为user的列,存储用户登录名;
创建用户账户
创建应该新用户账号,使用CREATE USER语句:
CREATE USER ben IDENTIFIED BY 'p@$$w+rd';
CREATE USER创建一个新用户账户,在创建用户账户时不一定需要口令,不过我们使用了IDENTIFIED 后面的就是口令;
为重新命名一个用户账户,使用RENAME USER语句:
RENAME USER ben TO bforta;![在这里插入图片描述](https://img-blog.csdnimg.cn/20201223210907340.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5NDk4NzQ5,size_16,color_FFFFFF,t_70)
删除用户账户
为删除一个用户账户,使用DROP USER语句:
DROP USER bforta;
设置访问权限
在创建用户账户,必须接着分配访问权限,新创建的用户账户没有访问权限,虽然他们能够登录MySQL,但不能看到数据,也不能指向任何数据库操作;
首先,我们要看到用户账号的权限使用:SHOW GRANTS FOR:
SHOW GRANTS FOR bforta;
可以看到用户bforta有一个权限USAGE ON . USAGE表示根本没有权限,此结果表示根本没有权限,此结果在任意数据库和任意表上对任何东西没有权限;
为设置权限,使用GRANT 语句,要求有以下的信息:
- 要赋予的权限
- 被赋予访问权限的数据库或表
- 用户名
GRANT SELECT ON crashcourse .* TO bforta;
此GRANT 允许用户在crashcourse .* 上使用SELECT ,通过只授予SELECT 访问权限,用bforta对crashcourse数据库中的所有数据具有只读访问权限:
SHOW GRANTS可以看到权限是这样的:
每个GRANT 添加用户的一个权限,MySQL读取所有的授权,并根据确定权限
GRANT 的反操作为REVOKE 撤销特定的权限:
REVOKE SELECT ON crashcourse .* FROM bforta;
REVOKE撤销用户的权限,crashcourse的访问权限,该权限一定要存在;
GRANT 和 REVOKE 在几个层次上控制访问权限:
- 整个服务器,使用GRANT ALL和REVOKE ALL
- 整个数据库,使用ON database .*;
- 特定的表,使用ON databases.table;
- 特定的列;
- 特定的存储过程
更改口令
可使用SET PASSWORD语句,新口令要加密:
SET PASSWORD FOR bforta = password('n3w p@$$w0rd');
SET PASSWORD 更新用户口令,新口令必须传递到Password() 函数进行加密;
SET PASSWORD 还可以设置自己的口令:
SET PASSWORD = Password('n3w p@$$w0rd');
在不指定用户名的情况下,SET PASSWORD更新当前登录用户的口令;
数据库维护
备份数据
像所有数据一样,MySQL的数据也必须经常备份,MySQL的数据库是基于磁盘的文件,普通的备份系统和例程能备份MySQL的数据,由于这些文件总是处于打开和使用状态,普通文件副本备份不一定总是备份到;
解决方案:
- 使用命令行应用程序MySQL dump转存储所有数据库内容到某个外部文件,在经常常规备份前这个实用程序应该正常允许,以便能够正确的备份转存文件
- 可用命令行实用程序MySQL hotcopy从应该数据库复制所有数据
- 可用实用MySQL的BACKUP TABLE 或 SELECT INTO OUTFILE转存所有数据到某个外部文件,这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会出错,数据可用使用RESTORE TABLE 进行复原;
进行数据库维护
MySQL提供一系列的语句,可用用来保证数据库正确和正常运行;
ANALYZE TABLE 用来检查表键是否正确,ANALYZE TABLE返回这样的状态信息:
CHECK TABLE用来针对许多问题对表进行检查,在MySQL表上对索引进行检查,CHECK TABLE支持一系列的用于myISAM表方式,CHANGED检查自最后一次检查以来的改动的表,EXTENDED执行最彻底的检查,FAST只检查未正常关闭的表,MEDIUM检查所有被删除的链接并进行键检验,QUICK只进行快速扫描;CHECK TABLE发现和修复问题;
- 如果myISAM表访问产生不正确和不一致的结果,可能需要用REPAIR TABLE来修复想应的表,这条语句不是经常使用;
- 如果从一个表中删除大量的数据,应该使用OPTIMIZE TABLE来收回所用的空间,来优化表的性能;
诊断启动问题
服务启动问题通常是对MySQL配置或服务器本身更改时出现,MySQL在这个问题发生时报告错误,由于多数MySQL服务器是作为系统进程或服务自动启动,可能会看不到;
在排除问题时,应该尽量用手动启动服务器,MySQL服务器自身通过在命令行上执行MySQL服务器;
查看日志文件
MySQL维护管理员依赖于日志文件,主要的日志文件有以下几种:
- 错误日志,包含启动和关闭问题以及任意关键错误的细节,此日志通常名为hostname.err,位于data目录中,此日志名可用于 – log - error 命令行选项更改
- 查询日志,记录所有的MySQL活动,在诊断问题有用,此日志文件可能会变得非常大,此日志通常名为hostname.log,位于data目录中,此名字可用于–log命令行选项更改
- 二进制文件,它记录更新过的数据的所有语句,此日志通常名为hostname-bin,位于data目录内,此名字可用用 --log-bin命令行选项更改。
- 缓慢查询日志,此日志记录执行缓慢的任何查询,这个日志在确定数据库何处需要优化很有用,此日志通常名为hostname-slow.log,位于data目录中,此名字用于–log-slow-queries命令行选项更改;
在使用日志时,可用FLUSH LOGS语句来刷新和重新开始所有日志文件;