MySQL日志

MySQL日志是记录MySQL数据库的日常做早和错误信息的文件。MySQL中,日志可以分为二进制日志、错误日志和通用查询日志以及慢查询日志。

日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化。当数据库遭到意外的损害时,可以通过日志文件来查询出错原因,并且可以通过日志文件进行数据恢复。

二进制日志

二进制日志也叫做变更日志(update log),主要用于记录数据库的变化情况。

启动和设置二进制日志

[ubuntu]
sujx@TC8304:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
\\查找定位log_bin,取消字段前面的#号
server-id       = 1
log_bin         = /var/log/mysql/mysql-bin.log 
sujx@TC8304:~$ sudo service mysql restart
sujx@TC8304:/var/log/mysql$ ls
error.log    mysql-bin.000002  mysql-bin.index  mysql-bin.000001

查看二进制日志

sujx@TC8304:/var/log/mysql$ sudo mysqlbinlog mysql-bin.000001

删除二进制日志

mysql> reset master;

MySQL的备份与还原

备份数据是数据库管理中最常用的操作。为了保证数据库中的数据的安全,数据库管理员需要定期的进行数据库备份。一旦数据库遭到破坏,即通过备份的文件来还原数据库。

数据备份

使用mysqldump命令备份

使用mysqldump命令备份
sujx@TC8304:~$ mysqldump -u sujx -p sujx employee > backupemployee.sql

直接复制整个数据库的目录

适用于MyISAM存储引擎,不适用Innodb.

使用mysqlhotcopy工具快速备份

数据还原

sujx@TC8304:~$ mysql -usujx -p sujx <backupemployee.sql

数据库迁移

MySQL用户管理

MySQL的用户主要包括普通用户和root用户。root用户权限包括创建用户、删除用户和修改普通用户密码等管理权限。而普通用户只拥有创建该用户时赋予它的权限。

权限表

安装MySQL时会自动安装一个名为mysql的数据库。数据库下面存储的都是权限表。用户登录以后,MySQL数据库会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表中最重要是user表、db表和host表。

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
31 rows in set (0.00 sec)

user表

  1. 用户列
    user表的用户列包括host|user|Password,分别表示主机名、用户名和密码。用户登录首先要判断着三个字段。修改用户密码实际就是修改user表的password字段。
  2. 权限列
    user表的权限列包括Select_priv,Insert_Priv等以priv结尾的字段。这些字段决定了用户的权限,其中包括查询、修改等普通权限,也包括饿了关闭服务的权限、超级权限和加载用户等高级管理权限。
    普通权限用于操作数据库。高级管理权限用于对数据库进行管理。
    这些字段值只有Y和N,Y表示该权限可以用到所有数据库上,N表示不能用到所有数据库。默认为N。
  3. 安全列
    user表的安全列只有4个字段,分别是ssl_type、ssl_cipher、X509_issur和X509_subject。ssl用于加密,x509用来标识用户。
  4. 资源控制列
    user表的资源控制列是max_questions、max_updates、max_connections、max_user_connections。max_questions和max_updates分别规定每小时可以允许执行多少次查询和更新;max_connections规定每小时可以建立多少链接;max_user_connections规定单个用户可以同时具有的连接数。默认值为0,表示没有限制。

db表和host表

db表和host表也是MySQL中重要的权限表。db表中存储了某个用户对一个数据库的权限。

  1. 用户列
    db表有三个字段:host、db和user。表示主机名、数据库名和用户名。
    host表有两个字段:host和db。
    host表示db表的扩展。
  2. 权限列
    db表和host表的权限列几乎一样,只是db表中多了一个create_routine_priv字段和alter_routine_priv字段。它决定用户是否具有创建和修改存储的权限。
    user表中的权限是针对所有数据库。如果user表中的select_priv字段取值Y,那么该用户可以查询所有数据库中的表。由此可知,用户先根据user表的内容获取权限,然后再根据db表的内容获取权限。

tables_priv表和columns_priv表

在MySQL中权限分配是按照user表、db表、tables_priv表和columns_priv表的顺序进行分配的。

tables_priv表对单个表权限进行限制;columns_priv表对单个数据列进行权限限制。tables_priv表包含8个字段,host、db、user、table_name、table_priv、column_priv、timestamp\、grantor.columns_priv表包括7个字段,是host、db、user、table_name、Column_name和Column_priv和timestamp。

procs_priv表

procs_priv表对存储过程和存储函数进行权限设置。

procs_priv表包含8个字段,分别是Host、DB、User、Routine_name、Routine_type、Routine_priv、timestamp、grantor。routine_name字段表示存储过程或函数的名称。Routine_type表示存储的类型。该字段有两个值,function(函数)和procdeure(存储过程)。proc_priv字段表示拥有的权限。权限分为三类,分别为execute、alter routine、grant。timestamp存储更行时间、grantor字段存储谁设置的权限。

账户管理

账户管理是MySQL用户管理的最基本的内容。账户管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。通过账户管理,可以保证MySQL数据库的安全性。

登录和退出MySQL服务器

mysql -h hostname|IP -P prot -u username -p Database -e "SQL语句"
\\在shell中执行sql命令,完成后自动退出
sujx@TC8304:~$ mysql -h 192.168.31.25 -P 3306 -u sujx -p sujx -e "show tables;"
Enter password: 
+----------------+
| Tables_in_sujx |
+----------------+
| department     |
| employee       |
| product        |
| t1             |
+----------------+
\\使用指定用户登录制定数据库
sujx@TC8304:~$ mysql -h 192.168.31.25 -P 3306 -u sujx -p sujx 
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show tables;
+----------------+
| Tables_in_sujx |
+----------------+
| department     |
| employee       |
| product        |
| t1             |
+----------------+
4 rows in set (0.00 sec)

新建普通用户

  1. 使用create user来创建用户;
mysql> create user 'test1'@'localhost' identified by 'test1';
  1. 使用insert语句来新建用户;
mysql> insert into mysql.user(host,user,authentication_string,ssl_cipher,x509_issuer,x509_subject) values('localhost','test1','test1','','','');
Query OK, 1 row affected (0.00 sec)

tips:从5.7版本开始mysql.user表中密码字段不再是password,而是authentication_string
3. 使用grant来新建普通用户;

mysql> grant select on sujx.* to 'test2'@'localhost' identified by 'test2';

删除普通用户

  1. 使用drop user来删除用户;
mysql> drop user 'test1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
  1. 使用delete来删除
    可以使用delete直接从mysql.user表中删除用户信息。

注意,要使用 flushprivileges 来刷新权限。

root修改密码

  1. 使用mysqladmin命令来修改root用户密码
sujx@TC8304:~$ mysqladmin -u root -p password "*******"
Enter password: **********
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
  1. 修改mysql.user表
update mysql.user set authentication_string='******' where user='root';
  1. 使用set语句来修改root用户密码
mysql> set password=password("******");
Query OK, 0 rows affected, 1 warning (0.00 sec)

修改普通用户密码

  1. 使用set语句
  2. 直接修改mysql.user表
  3. 用grant语句来修改

root用户密码丢失

  1. 使用--skip-grant-tables选项启动MySQL;
sujx@TC8304:~$ sudo service mysql stop
sujx@TC8304:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 
\\在[mysqld]字段下增加:skip-grant-tables
sujx@TC8304:~$ sudo service mysql start
sujx@TC8304:~$ mysql
  1. 无密码登陆root用户,必须使用update修改密码;
update user set authentication_string=password('******') where user='root' and host='localhost';
  1. 加载权限表
  2. 去除配置文件中过的skip_grant_tables项

权限管理

  1. 授权
mysql> grant all privileges on sujx.* to 'sujx'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'sujx';
+------------------------------------------------+
| Grants for sujx@%                              |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'sujx'@'%'               |
| GRANT ALL PRIVILEGES ON `sujx`.* TO 'sujx'@'%' |
+------------------------------------------------+
2 rows in set (0.00 sec)
  1. 收回
mysql> revoke all privileges, grant option from 'sujx';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'sujx';
+----------------------------------+
| Grants for sujx@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO 'sujx'@'%' |
+----------------------------------+
1 row in set (0.00 sec)
  1. 查看
mysql> show grants for 'sujx';
+------------------------------------------------+
| Grants for sujx@%                              |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'sujx'@'%'               |
| GRANT ALL PRIVILEGES ON `sujx`.* TO 'sujx'@'%' |
+------------------------------------------------+
2 rows in set (0.00 sec)