MySQL数据库进阶

文章目录

  • 一、管理事务处理
  • 二、全球化和本地化
    • [1. 字符集和校对顺序](#1. 字符集和校对顺序)
    • [2. 使用字符集和校对顺序](#2. 使用字符集和校对顺序)
  • 三、安全管理
    • [1. 访问控制](#1. 访问控制)
    • [2. 管理用户](#2. 管理用户)
      • [2.1 创建用户账号](#2.1 创建用户账号)
      • [2.2 删除用户账号](#2.2 删除用户账号)
      • [2.3 设置访问权限](#2.3 设置访问权限)
      • [2.4 更改口令](#2.4 更改口令)
  • 四、数据库维护
    • [1. 备份数据](#1. 备份数据)
    • [2. 进行数据库维护](#2. 进行数据库维护)
    • [3. 诊断启动问题](#3. 诊断启动问题)
    • [4. 查看日志文件](#4. 查看日志文件)

一、管理事务处理

1.事务处理

并非所有引擎都支持明确的事务处理管理。MyISAM和InnoDB是两种最常使用的引擎。前者不支持明确的事务处理管理,而后者支持。

事务处理:(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。

事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。

利用事务处理,可以保证一组操作不会中途停止,它们或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发生,整组语句提交给(写到)数据库表。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态。

事务处理的几个术语:

  • 事务(transaction)指一组SQL语句;
  • 回退(rollback)指撤销指定SQL语句的过程;
  • 提交(commit)指将未存储的SQL语句结果写入数据库表;
  • 保留点(savepoint)指事务处理中设置的临时占位(placeholder),你可以对它发布回退(与回退整个事务处理不同)。

2. 控制事务处理

MySQL使用下面的语句来标识事务的开始:

START TRANSACTION
  1. 使用ROLLBACK

    SELECT * FROM ordertotals;
    START TRANSACTION;
    DELETE FROM ordertotals;
    SELECT * FROM ordertotals;
    ROLLBACK;
    SELECT * FROM ordertotals;

ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后)

  1. 使用COMMIT
    一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。
    在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用COMMIT语句.

    START TRANSACTION
    DELETE FROM orderitems WHERE order_num = 20010;
    DELETE FROM orders WHERE order_num = 20010;
    COMMIT;

  2. 使用保留点
    为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符。
    这些占位符称为保留点。为了创建占位符,可使用SAVEPOINT

    SAVEPOINT deletel1;
    ROLLBACK TO delete1;

每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道要

回退到何处。

  1. 更改默认的提交行为
    默认的MySQL行为是自动提交所有更改。换句话说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。为指示MySQL不自动提交更改,需要使用以下语句:

    SET autocommit = 0;

二、全球化和本地化

1. 字符集和校对顺序

重要术语:

  • 字符集为字母和符号的集合;
  • 编码为某个字符集成员的内部表示;
  • 校对为规定字符如何比较的指令。

在MySQL的正常数据库活动(SELECT、INSERT等)中,不需要操心太多的东西。使用何种字符集和校对的决定在服务器、数据库和表级进行。

2. 使用字符集和校对顺序

MySQL支持众多的字符集。

  1. 查看所支持的字符集完整列表
    显示所有可用的字符集以及每个字符集的描述和默认校对

    SHOW CHARACTER SET;

  2. 查看所支持校对的完整列表
    显示所有可用的校对,以及它们适用的字符集。

    SHOW COLLATION

  3. 确定所用的字符集和校对

    SHOW VARIABLES LIKE 'character%';
    SHOW VARIABLES LIKE 'collation%';

  4. 为了给表指定字符集和校对,可使用带子句的CREATE TABLE

    CREATE TABLE mytable
    (
    columnn1 INT,
    columnn2 VARCHAR(10)
    ) DEFAULT CHARACTER SET hebrew
    COLLATE hebrew_general_ci;

  5. 对每个列设置字符集和校对

    CREATE TABLE mytable
    (
    columnn1 INT,
    columnn2 VARCHAR(10),
    columnn3 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_swedish_ci
    ) DEFAULT CHARACTER SET hebrew
    COLLATE latin1_swedish_ci;

  6. 在SELECT语句排序

    SELECT * FROM customers
    ORDER BY lastname, firstname COLLATE latin1_swedish_ci;

三、安全管理

1. 访问控制

需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。

重要的是注意到,访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果,如错打MySQL语句,在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句,访问控制有助于避免这些情况的发生。

2. 管理用户

获取用户账号列表

USE mysql;
SELECT user FROM user;

2.1 创建用户账号

CREATE USER test IDENTIFIED BY 'test01'

重新命名一个用户账号

RENAME USER test TO bforta;

2.2 删除用户账号

DROP USER bforta;

2.3 设置访问权限

  1. 查看账号权限

    SHOW GRANTS FOR test;

  1. 为设置权限,使用GRANT语句。GRANT需要以下信息:
  • 要授予的权限;

  • 被授予访问权限的数据库或表;

  • 用户名。

    GRANT SELECT ON crashcourse.* TO test;

  1. GRANT的反操作为REVOKE,用它来撤销特定的权限。

    REVOKE SELECT ON crashcourse.* FROM test;

  2. GRANT和REVOKE可在几个层次上控制访问权限:

  • 整个服务器,使用GRANT ALL和REVOKE ALL;
  • 整个数据库,使用ON database.*;
  • 特定的表,使用ON database.table;
  • 特定的列;
  • 特定的存储过程。

出可以授予或撤销的每个权限。

权限 说明
ALL 除GRANT OPTION外的所有权限
ALTER 使用ALTER TABLE
ALTER ROUTINE 使用ALTER PROCEDURE和DROP PROCEDURE
CREATE 使用CREATE TABLE
CREATE ROUTINE 使用CREATE PROCEDURE
CREATE TEMPORARY TABLES 使用CREATE TEMPORARY TABLE
CREATE USER 使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES
CREATE VIEW 使用CREATE VIEW
DELETE 使用DELETE
DROP 使用DROP TABLE
EXECUTE 使用CALL和存储过程
FILE 使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION 使用GRANT和REVOKE
INDEX 使用CREATE INDEX和DROP INDEX
INSERT 使用INSERT
LOCK TABLES 使用LOCK TABLES
PROCESS 使用SHOW FULL PROCESSLIST
RELOAD 使用FLUSH
REPLICATION CLIENT 服务器位置的访问
REPLICATION SLAVE 由复制从属使用
SELECT 使用SELECT
SHOW DATABASES 使用SHOW DATABASES
SHOW VIEW 使用SHOW CREATE VIEW
SHUTDOWN 使用mysqladmin shutdown(用来关闭MySQL)
SUPER 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER和SET GLOBAL。还允许mysqladmin调试登录
UPDATE 使用UPDATE
USAGE 无访问权限

2.4 更改口令

更改用户口令,可使用SET PASSWORD语句

SET PASSWORD FROM test = PASSWORD('test02');

新口令必须传递到Password()函数进行加密

设置自己的口令:

SET PASSWORD = PASSWORD('test02');

四、数据库维护

1. 备份数据

像所有数据一样,MySQL的数据也必须经常备份。

备份解决方案:

  • 使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件。在进行常规备份前这个实用程序应该正常运行,以便能正确地备份转储文件。
  • 可用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序)
  • 可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件。这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会出错。数据可以用RESTORE TABLE来复原。

2. 进行数据库维护

MySQL提供了一系列的语句,可以(应该)用来保证数据库正确和正常运行。

  • ANALYZE TABLE,用来检查表键是否正确。

    ANALYZE TABLE orders;

  • CHECK TABLE用来针对许多问题对表进行检查。在MyISAM表上还对索引进行检查。CHECK TABLE支持一系列的用于MyISAM表的方式。CHANGED检查自最后一次检查以来改动过的表。EXTENDED执行最彻底的检查,FAST只检查未正常关闭的表,MEDIUM检查所有被删除的链接并进行键检验,QUICK只进行快速扫描。

    CHECK TABLE orders, orderitems;

  • 如果MyISAM表访问产生不正确和不一致的结果,可能需要用REPAIR TABLE来修复相应的表。这条语句不应该经常使用,如果需要经常使用,可能会有更大的问题要解决。
  • 如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间,从而优化表的性能。

3. 诊断启动问题

服务器启动问题通常在对MySQL配置或服务器本身进行更改时出现。MySQL在这个问题发生时报告错误,但由于多数MySQL服务器是作为系统进程或服务自动启动的,这些消息可能看不到。

在排除系统启动问题时,首先应该尽量用手动启动服务器。MySQL服务器自身通过在命令行上执行mysqld启动。

mysqld命令行选项:

  • -- help 显示帮助 ------ 一个选项列表;
  • -- safe-mode 装载减去某些最佳配置的服务器;
  • --verbose 显示全文本消息(为获得更详细的帮助消息与--help联合使用);
  • --version 显示版本信息然后退出。

4. 查看日志文件

  • 错误日志。它包含启动和关闭问题以及任意关键错误的细节。此日志通常名hostname.err,位于data目录中。此日志名可用--log-error命令行选项更改。
  • 查询日志。它记录所有MySQL活动,在诊断问题时非常有用。此日志文件可能会很快地变得非常大,因此不应该长期使用它。此日志通常名为hostname.log,位于data目录中。此名字可以用--log命令行选项更改。
  • 二进制日志。它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为hostname-bin,位于data目录内。此名字可以用--log-bin命令行选项更改。
    注意,这个日志文件是MySQL5中添加的,以前的MySQL版本中使用的是更新日志。
  • 缓慢查询日志。顾名思义,此日志记录执行缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为hostname-slow.log ,位于 data 目录中。此名字可以用--log-slow-queries命令行选项更改。

在使用日志时,可用FLUSH LOGS语句来刷新和重新开始所有日志文件。

相关推荐
Ai 编码助手2 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员2 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle3 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻3 小时前
MySQL排序查询
数据库·mysql
萧鼎3 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^3 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
荒川之神3 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师3 小时前
Oracle 23AI创建示例库
数据库·oracle
小白学大数据3 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫