brief
- 访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果,如错打MySQL语句,在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句,访问控制有助于避免这些情况的发生。
- 管理访问控制需要创建和管理用户账号
- 像所有数据一样, MySQL的数据也必须经常备份
学习内容
本节主要记录的内容包括:
- Mysql的访问控制
- Mysql的用户管理
- 数据库备份
详细记录
管理用户
MySQL用户账号和信息存储在名为mysql的MySQL数据库中。
mysql数据库有一个名为user的表, 它包含所有用户账号。
user表有一个名为user的列,它存储用户登录名。
Use mysql;
SELECT user from user;
- 创建用户
# 创建一个新用户账号,指定的口令为纯文本
CREATE USER newguy IDENTIFIED BY 'textpassword';
# 创建一个新用户账号,指定的口令为散列值
CREATE USER newguy IDENTIFIED BY PASSWORD 'hashvaluepassword';
# 为重新命名一个用户账号,使用RENAME USER语句
RENANE USER newguy TO oldguy;
# 为了删除一个用户账号(以及相关的权限),使用DROP USER语句
DROP USER oldguy;
-
设置访问权限
在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但不能看到数据,不能执行任何数据库操作。MySQL的权限用 用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)
为设置权限,使用GRANT语句。 GRANT要求你至少给出以下信息:
- 要授予的权限;
- 被授予访问权限的数据库或表;
- 用户名
# 为看到赋予用户账号的权限,使用SHOW GRANTS FOR
SHOW GRANTS FOR newguy;
# 此GRANT允许用户在crashcourse.*( crashcourse数据库的所有表)上使用SELECT
GRANT SELECT ON crashcourse.* TO newguy;
# 每个GRANT添加(或更新)用户的一个权限。 MySQL读取所有授权,并根据它们确定权限
GRANT DELETE ON crashcourse.* TO newguy;
# GRANT的反操作为REVOKE,用它来撤销特定的权限
REVOKE DELETE ON crashcourse.* FROM newguy;
- GRANT和REVOKE可在几个层次上控制访问权限:
- 整个服务器,使用GRANT ALL和REVOKE ALL;
- 整个数据库,使用ON database.*;
- 特定的表,使用ON database.table;
- 特定的列;
- 特定的存储过程。
- 更改登陆密码
# 对其他用户设置密码
SET PASSWORD FOR newguy = Password('newpassword');
# 对自己更新密码
SET PASSWORD = Password('newpassword');
- 备份数据库
- 使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件
- 可用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序)
- 可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件。这两条语句都接受将要创建的系统文件 名,此系统文件必须不存在,否则会出错。数据可以用RESTORE TABLE来复原
- 为了保证所有数据被写到磁盘(包括索引数据),可能需要在进行备份前使用FLUSH TABLES语句
# 这样会将table_name表中的所有数据备份到指定的文件中
BACKUP TABLE table_name TO '/path/to/backup/file';
# 这个语句会将table_name表中的所有数据导出到指定的文件中
SELECT * INTO OUTFILE '/path/to/output/file' FROM table_name;
# 这个语句会将指定的备份文件恢复为table_name表,并覆盖已有的表数据。
# 需要注意的是,该操作将删除原有表中的所有数据,请谨慎使用
RESTORE TABLE table_name FROM '/path/to/backup/file';
# 如果是使用SELECT INTO OUTFILE命令导出的数据文件,可以使用LOAD DATA INFILE语句将数据文件导入到表中
LOAD DATA INFILE '/path/to/data/file' INTO TABLE table_name;
- 数据库维护
# 连接到MySQL服务器
mysql -u username -p
# 显示所有数据库
SHOW DATABASES;
# 切换到特定的数据库
USE database_name;
# 显示数据库中的所有表
SHOW TABLES;
# 备份数据库
mysqldump -u username -p database_name > backup_file.sql
# 恢复数据库
mysql -u username -p database_name < backup_file.sql
# 优化数据库表
# 如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间,从而优化表的性能
OPTIMIZE TABLE table_name;
# 修复数据库表
REPAIR TABLE table_name;
# 用来检查表键是否正确
ANALYZE TABLE table_name;
# 针对许多问题对表进行检查
CHECK TABLE table_name;