Linux环境下mysql的日志

MySQL日志

一、日志概述

1.日志作用

​ MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。

2.日志分为

  • 错误日志:记录mysql服务的启动,运行或停止mysql服务时出现的问题
  • 查询日志:记录建立的客户端的连接和执行的语句
  • 二进制日志:记录所有更改数据的语句,可以用于数据的复制
  • 慢查询日志:记录所有执行的时间超过long_query_time的所有查询或不使用索引的查询

提示:

​ 默认情况下,所有日志创建与MySQL数据目录中,通过刷新日志,可以强制MySQL关闭和重新打开日志文件,Flush logs刷新日志或者执行mysqladmin flush-logs 如果正使用MySQL复制功能,在复制服务器上可以维护更多日志文件,这种日志我们称为接替日志。启动日志功能会降低MySQL数据库的性能。

二、日志

MySQL有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同,因此mysql提供几组命令:

1.查看系统状态

 

mysql> help show variables
Name: 'SHOW VARIABLES'
Description:
Syntax:
SHOW [GLOBAL | SESSION] VARIABLES
# 	   全局	当前会话
    [LIKE 'pattern' | WHERE expr]
......
#查看全局
mysql> show global variables\G
mysql> show global variables like '%log%'\G
#查看当前会话
mysql> show session variables\G
mysql> show session variables like '%log%'\G

2.查看运行状态

mysql> help show status
Name: 'SHOW STATUS'
Description:
Syntax:
SHOW [GLOBAL | SESSION] STATUS
# 	   全局	  当前会话
    [LIKE 'pattern' | WHERE expr]
......
#查看全局
mysql> show global status\G
mysql> show global status like'%log%'\G
#查看当前会话
mysql> show session status\G
mysql> show session status like'%log%'\G

 3.查看mysql的版本

#方法一:
[root@mysql ~]# mysql -V
mysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper

#方法二:
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper

Connection id:		4
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.32 Source distribution
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql.sock
Uptime:			54 min 50 sec

Threads: 1  Questions: 34  Slow queries: 0  Opens: 114  Flush tables: 1  Open tables: 107  Queries per second avg: 0.010

#方法三:
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.32    |
+-----------+
1 row in set (0.00 sec)

4.修改系统配置

方法1:配置文件设置my.cnf 如:binlog_cache_size = 1M

方法2:set global binlog_cache_size = 1048576

 

2.1 错误日志(error log)

​ 在mysql数据库中,错误日志功能是默认开启的。默认情况下,错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。

默认情况下错误日志大概记录以下几个方面的信息:

  • 服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)
  • 服务器运行过程中的错误信息
  • 事件调度器运行一个事件时产生的信息
  • 从服务器上启动服务器进程时产生的信息

一般而言,日志级别的定义没有会话变量都只是在全局级别下进行定义 错误日志的状态:

mysql> 
mysql> show global variables like '%log_error%';
+---------------------+---------------------------------+
| Variable_name       | Value                           |
+---------------------+---------------------------------+
| binlog_error_action | ABORT_SERVER                    |
| log_error           | /usr/local/mysql/data/mysql.err |
| log_error_verbosity | 3                               |
+---------------------+---------------------------------+
3 rows in set (0.33 sec)

 

其中 log_error定义为错误日志文件路径 log_error_verbosity:

Verbosity Value Message Types Logged
1 Errors only
2 Errors and warnings
3 Errors,warnings,and notes(default)

 

修改配置文件

[root@mysql ~]# vim /etc/my.cnf
......
log-error=/usr/local/mysql/data/mysql.err
[root@mysql ~]# systemctl restart mysqld.service 
#查看错误日志
[root@mysql ~]# tail /usr/local/mysql/data/mysql.err 
2021-03-03T07:46:30.719608Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
2021-03-03T07:46:30.720085Z 0 [Warning] CA certificate ca.pem is self signed.
2021-03-03T07:46:30.720120Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
2021-03-03T07:46:30.720552Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2021-03-03T07:46:30.720586Z 0 [Note] IPv6 is available.
2021-03-03T07:46:30.720594Z 0 [Note]   - '::' resolves to '::';
2021-03-03T07:46:30.720604Z 0 [Note] Server socket created on IP: '::'.
2021-03-03T07:46:30.726355Z 0 [Note] Event Scheduler: Loaded 0 events
2021-03-03T07:46:30.726655Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.32'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

为了方便维护需要,有时候会希望将错误日志中的内容做备份并重新开始记录,这时候就可以利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。 删除错误日志: 在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –uroot –p flush-logs也可以登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。 在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的:方式如下:

[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# mv mysql.err mysql.errold
[root@mysql data]# mysqladmin -uroot -p123456 flush-logs

官方文档:

http://dev.mysql.com/doc/refman/5.5/en/error-log.html

http://dev.mysql.com/doc/refman/5.6/en/error-log.html

http://dev.mysql.com/doc/refman/5.7/en/error-log.html

2.2 二进制日志

​ 主要记录MySQL数据库的变化,二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据。二进制日志还包含关于每个更新数据库的语句的执行时间,它不包含没有修改任何数据的语句。使用二进制日志的主要目的是最大可能地恢复数据库。

2.2.1 启动二进制日志

默认情况下二进制日志一般都是关闭状态

[root@mysql ~]# vim /etc/my.cnf 
[root@mysql ~]# tail -4 /etc/my.cnf 
server-id = 1
log-bin = /usr/local/mysql/data/mysql-bin
expire_logs_days=10   #清除日志的天数
max_binlog_size=100M  #单个日志文件的大小限制,超出限制会新建一个日志文件,默认的为1GB
[root@mysql ~]# systemctl restart mysqld.service 

2.2.2 查询日志设置

mysql> show variables like '%log_%';
+--------------------------------------------+---------------------------------------------+
| Variable_name                              | Value                                       |
+--------------------------------------------+---------------------------------------------+
......
| log_bin                                    | ON                                          |
| log_bin_trust_function_creators            | OFF                                         |
| log_error                                  | /usr/local/mysql/data/mysql.err             |
| log_output                                 | FILE                                        |
| log_queries_not_using_indexes              | OFF                                         |
| log_slave_updates                          | OFF                                         |
| log_warnings                               | 2                                           |
......

2.2.3 查看二进制日志

​ MySQL二进制日志存储了所有的变更信息,MySQL二进制日志经常使用。当MySQL创建二进制日志文件时,首先创建一个以’filename’为名称,以’.index’为后缀的文件;在创建一个以’filename’为名称,以’.000001’为后缀的文件。当MySQL服务重启一次,以’.000001’为后缀的文件会增加一个,并且后缀名加1递增。如果日志长度超过max_binlog_size的上限,也会创建一个新的日志。 Show binary logs;可以查看当前的二进制日志文件个数及其文件名。二进制日志并不能直接查看,如果想要查看日志内容,可以通过mysqlbinlog命令查看。

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |       154 |
+------------------+-----------+
2 rows in set (0.00 sec)

2.2.4 查看二进制日志的内容

[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# mysqlbinlog  mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#210303 16:00:45 server id 1  end_log_pos 123 CRC32 0xe50fcbfd 	Start: binlog v 4, server v 5.7.32-log created 210303 16:00:45 at startup
ROLLBACK/*!*/;
BINLOG '
LUI/YA8BAAAAdwAAAHsAAAAAAAQANS43LjMyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAtQj9gEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
Af3LD+U=
'/*!*/;
# at 123
#210303 16:00:45 server id 1  end_log_pos 154 CRC32 0x022325b8 	Previous-GTIDs
# [empty]
# at 154
#210303 16:01:50 server id 1  end_log_pos 177 CRC32 0xc4079abd 	Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

2.2.5 删除二进制日志

​ MySQL的二进制文件可以配置自动删除,同时MySQL提供了手动删除二进制文件的方法:RESET MASTER 删除所有的二进制日志文件;PURGE MASTER LOGS只删除部分二进制日志文件。 Resetmaster; 删除所有二进制日志 Purge master logs to ‘二进制名’ 删除单个二进制日志之前的。

mysql> purge master logs to "mysql-bin.000002";
Query OK, 0 rows affected (0.01 sec)

#删除指定日期的二进制日志
mysql> purge binary logs before 'date';
Query OK, 0 rows affected, 2 warnings (0.11 sec)

mysql> purge master logs before '20210303';
Query OK, 0 rows affected, 1 warning (0.00 sec)

2.2.6 还原二进制日志

[root@mysql data]# mysqlbinlog --start-date='2021-03-03 16:00:45' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p123456
mysqlbinlog: [ERROR] unknown variable 'start-date=2021-03-03 16:00:45'
mysql: [Warning] Using a password on the command line interface can be insecure.

2.2.7 暂时停止二进制日志的功能

#0暂停  1恢复
mysql> set sql_log_bin = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> set sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec)

2.3 事务日志(redo日志)

​ 事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的。 如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。

查看事务日志的定义:

mysql> show global variables like '%log%';
+--------------------------------------------+---------------------------------------------+
| Variable_name                              | Value                                       |
+--------------------------------------------+---------------------------------------------+
 innodb_flush_log_at_timeout                | 1                                           |
| innodb_flush_log_at_trx_commit             | 1                                           | ##在事务提交时innodb是否同步日志从缓冲区到文件中,当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新,性能会很差造成大量的磁盘I/O但这种方式最安全;如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘。设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。
#在事务提交时innodb是否同步日志从缓冲区到文件中,当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新,性能会很差造成大量的磁盘I/O但这种方式最安全;如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘。设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。
#总结
#设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能
| innodb_locks_unsafe_for_binlog             | OFF                                         |
| innodb_log_buffer_size                     | 16777216                                    |
| innodb_log_checksums                       | ON                                          |
| innodb_log_compressed_pages                | ON                                          |
| innodb_log_file_size                       | 50331648                                    |#日志文件大小 
| innodb_log_files_in_group                  | 2                                           |# DB中设置几组事务日志,默认是2
| innodb_log_group_home_dir                  | ./                                          | #定义innodb事务日志组的位置,此位置设置默认为MySQL的datadir 
              
......

​ 每个事务日志都是大小为50兆的文件(不同版本的mysql有差异): 在mysql中默认以ib_logfile0,ib_logfile1名称存在。

2.4 慢查询日志 slow query log

​ 顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow query。 慢查询日志采用的是简单的文本格式,可以通过各种文本编辑器查看其中的内容。其中 记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等相关信息。 慢查询日志的作用: 慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。MySQL 还提供了专门用来分析满查询日志的工具程序mysqldumpslow,用来帮助数据库管理人员解决可能存在的性能问题。

查看慢查询日志的定义:

mysql> show global variables like '%slow_query_log%';
+---------------------+--------------------------------------+
| Variable_name       | Value                                |
+---------------------+--------------------------------------+
| slow_query_log      | OFF                                  |
| slow_query_log_file | /usr/local/mysql/data/mysql-slow.log |
+---------------------+--------------------------------------+
2 rows in set (0.00 sec)


mysql> show global variables like '%long%';
+----------------------------------------------------------+-----------+
| Variable_name                                            | Value     |
+----------------------------------------------------------+-----------+
| long_query_time                                          | 10.000000 |
| performance_schema_events_stages_history_long_size       | 10000     |
| performance_schema_events_statements_history_long_size   | 10000     |
| performance_schema_events_transactions_history_long_size | 10000     |
| performance_schema_events_waits_history_long_size        | 10000     |
+----------------------------------------------------------+-----------+
5 rows in set (0.00 sec)

启动和设置慢查询日志

**方法一:**通过配置文件my.cnf开启慢查询日志:

PS:在不同的mysql版本中,开启慢查询日志参数不太一样,不过都可以通过 show variables like"%slow%" 和show variables like "%long%"查看出来。

mysql> show global variables like '%slow%';
+---------------------------+--------------------------------------+
| Variable_name             | Value                                |
+---------------------------+--------------------------------------+
| log_slow_admin_statements | OFF                                  |
| log_slow_slave_statements | OFF                                  |
| slow_launch_time          | 2                                    |
| slow_query_log            | OFF                                  |
| slow_query_log_file       | /usr/local/mysql/data/mysql-slow.log |
+---------------------------+--------------------------------------+
5 rows in set (0.00 sec)

​ 其中: slow_query_log: off关闭状态 on开启状态 slow_query_log_file 慢查询日志存放地点 long_query_time选项来设置一个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中, 设置为0的话表示记录所有的查询。 slow_launch_time 表示如果建立线程花费了比这个值更长的时间,slow_launch_threads 计数器将增加 注:如果不指定存储路径,慢查询日志默认存储到mysql数据库的数据文件下,如果不指定文件名,默认文件名为hostname-slow.log

修改my.cnf文件:

[root@mysql data]#  vim /etc/my.cnf 
[root@mysql data]# tail -4 /etc/my.cnf 
slow_query_log=1
slow_query_log_file=/usr/local/mysql/data/mysql-slow.log
long_query_time=1
slow_launch_time=1
[root@mysql data]# systemctl  restart mysqld.service

mysql> show global variables like '%slow%';
+---------------------------+--------------------------------------+
| Variable_name             | Value                                |
+---------------------------+--------------------------------------+
| log_slow_admin_statements | OFF                                  |
| log_slow_slave_statements | OFF                                  |
| slow_launch_time          | 1                                    |
| slow_query_log            | ON                                   |
| slow_query_log_file       | /usr/local/mysql/data/mysql-slow.log |
+---------------------------+--------------------------------------+
5 rows in set (0.00 sec)

**方法2:**通过登录mysql服务器直接定义

mysql> use mysql;
Database changed
mysql> select user,host from user where user="root";
+------+-----------+
| user | host      |
+------+-----------+
| root | localhost |
+------+-----------+
1 row in set (0.00 sec)

或用系统查看文件内容命令如cat直接查看慢日志文件

​ 第一行表示记录日志时的时间。其格式是 YYYY-MM-DD HH:MM:SS。我们可以看出上面的查询记录于 2016 年8 月 29 日下午 15:47:24 - 注意:这个是服务器时间. MySql 用户、服务器以及主机名第三行表示总的查询时间、锁定时间、"发送"或者返回的行数 Query_time: 0.000304 表示用了0.000304秒 Lock_time: 0.000128 表示锁了0.000128秒 Rows_sent: 4 表示返回4行 Rows_examined: 4 表示一共查了4行 SET timestamp=UNIXTIME; 这是查询实际发生的时间 何将其变成一个有用的时间,将 Unix 时间转成一个可读的时间,可以使用 date –d@日志中的时间戳以看到查询进行的同时记录了该日志 ,但是对于一台超负载的服务器常常并非如此。因此记住:SETtimestamp= value 才是实际的查询的执行时间。

​ 慢查询分析mysqldumpslow 们可以通过打开log文件查看得知哪些SQL执行效率低下。从日志中,可以发现查询时间超过long_query_time时间的query为慢查询,而小于long_query_time时间的没有出现在此日志中。 如果慢查询日志中记录内容很多,可以使用mysqldumpslow工具(MySQL客户端安装自带)来对慢查询日志进行分类汇总。mysqldumpslow对日志文件进行了分类汇总,显示汇总后摘要结果 进入log的存放目录,运行

[root@mysql data]# ls
auto.cnf         ib_buffer_pool  mysql             mysql.err           public_key.pem
ca-key.pem       ibdata1         mysql-bin.000002  mysql.errold        server-cert.pem
ca.pem           ib_logfile0     mysql-bin.000003  mysql-slow.log      server-key.pem
client-cert.pem  ib_logfile1     mysql-bin.index   performance_schema  sys
client-key.pem   ibtmp1          mysqld.pid        private_key.pem     tl
[root@mysql data]# mysqldumpslow mysql-slow.log 

Reading mysql slow query log from mysql-slow.log
Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), 0users@0hosts
  

PS: mysqldumpslow -s c -t 10 /database/mysql/slow-query.log 这会输出记录次数最多的10条SQL语句,其中: -s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒序; -t, 是top n的意思,即为返回前面多少条的数据; -g, 后边可以写一个正则匹配模式,大小写不敏感的; 例如: /path/mysqldumpslow -s r -t 10/database/mysql/slow-log 得到返回记录集最多的10个查询。/path/mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log 得到按照时间排序的前10条里面含有左连接的查询语句

 

2.5 数据文件

​ 在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL 存储引擎有各自不同的数据文件。如MyISAM用“.MYD”作为扩展名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等

登录mysql,创建一个数据库如testdb,并在数据库中创建一个表test1

mysql> create database testdb;
mysql> use testdb
mysql> create table test1(id int);

查看数据库所在目录会发现数据目录下存在一个以数据库名字命名的文件夹

[root@mysql ~]# ls /usr/local/mysql/data/
……  testdb

查看testdb目录的文件列表

[root@mysql ~]# ll /usr/local/mysql/data/testdb/
total 112
-rw-r----- 1 mysql mysql   61 Jan  7 01:13 db.opt
-rw-r----- 1 mysql mysql  8556 Jan  7 01:13 test1.frm
-rw-r----- 1 mysql mysql 98304 Jan  7 01:13 test1.ibd

从上边可以看出表使用的是innodb存储引擎。

以myisam存储引擎创建一个测试表test2

mysql> create table test2(id int) engine=myisam;

查看数据库目录

[root@mysql ~]# ll /usr/local/mysql/data/testdb/
total 128
-rw-r----- 1 mysql mysql   61 Jan  7 01:13 db.opt
-rw-r----- 1 mysql mysql  8556 Jan  7 01:13 test1.frm
-rw-r----- 1 mysql mysql 98304 Jan  7 01:13 test1.ibd
-rw-r----- 1 mysql mysql  8556 Jan  7 01:17 test2.frm
-rw-r----- 1 mysql mysql   0 Jan  7 01:17 test2.MYD
-rw-r----- 1 mysql mysql  1024 Jan  7 01:17 test2.MYI

注:修改mysql的默认存储引擎
1、查看mysql存储引擎命令,在mysql>提示符下搞入show engines;字段 Support为:Default表示默认存储引擎
2、设置InnoDB为默认引擎:在配置文件my.cnf中的 [mysqld] 下面加入 default-storage-engine=INNODB 一句
3、重启mysql服务器:mysqladmin -u root -p shutdown或者service mysqld restart 登录mysql数据库,
1、“.frm”文件 与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎(MySQL常用的两个存储引擎是MyISAM和InnoDB),每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。MyISAM数据库表文件:.MYD文件:表数据文件;.MYI文件:索引文件
2、“.MYD”文件 “.MYD”文件是MyISAM存储引擎专用,存放MyISAM 表的数据。每一个MyISAM表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。
3、“.MYI”文件 “.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引相关信息。对于MyISAM 存储来说,可以被cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。InnoDB采用表空间(tablespace)来管理数据,存储表数据和索引。 .ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引。InnoDB共享表空间(即InnoDB文件集,ibfile set):ibdata1、ibdata2等,存储InnoDB
系统信息和用户数据库表数据和索引,所有表共用。
4、“.ibd”文件和ibdata 文件 这两种文件都是存放Innodb 数据的文件,之所以有两种文件来存放Innodb 的数据(包括索引),是因为Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和MyISAM数据相同的位置。如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。 ibdata 文件可以通过innodb_data_home_dir 和innodb_data_file_path 两个参数共同配置组成, innodb_data_home_dir 配置数据存放的总目录, 而innodb_data_file_path 配置每一个文件的名称。 innodb_data_file_path 中可以一次配置多个ibdata 文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb 限制了仅仅只有最后一个ibdata 文件能够配置成自动扩展类型。当我们需要添加新的 ibdata 文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启MySQL 才能完成ibdata 的添加工作。不过如果我们使用独享表空间存储方式的话,就不会有这样的问题。
总结:

共享表空间以及独占表空间都是针对数据的存储方式而言的。

共享表空间:某一个数据库的所有的表数据,索引文件全部放在一个文件中。
独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。
其中这个文件包括了单独一个表的数据内容以及索引内容。
两者之间的优缺点
共享表空间:
优点: 可以放表空间分成多个文件存放到各个磁盘上。数据和文件放在一起方便管理。
缺点: 所有的数据和索引存放到一个文件中,多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
独立表空间:
优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。

3.可以实现单表在不同的数据库中移动。
4.空间可以回收
a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
b)对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 缺点: 单表增加过大,如超过100个G。 相比较之下,使用独占表空间的效率以及性能会更高一点

查看当前数据库的表空间管理类型

mysql> show variables like '%innodb_file_per%';
+-----------------------+-------+
| Variable_name     | Value |
+-----------------------+-------+
| innodb_file_per_table | ON  |
+-----------------------+-------+
1 row in set (0.00 sec)

PS:ON代表独立表空间管理,OFF代表共享表空间管理;(查看单表的表空间管理方式,需要查看每个表是否有单独的数据文件)

Innodb共享表空间配置: 修改my.cnf文件:

[root@mysql ~]# vim /etc/my.cnf
添加:
[mysqld]
……
innodb_file_per_table=0
innodb_data_file_path=ibdata1:100M:autoextend
innodb_data_home_dir=/usr/local/mysql/data

参数解释:

  • innodb_data_home_dir = “/path/” 数据库文件所存放的目录
  • innodb_log_group_home_dir = “/path/” 日志存放目录
  • innodb_data_file_path=ibdata1:10M:autoextend 设置一个可扩展大小的尺寸为10MB的数据文件(共享数据文件),名为ibdata1。没有给出文件的位置,所以默认的是在MySQL的数据目录内。
  • innodb_file_per_table=1|0 # 1为使用独占表空间,0 为使用共享表空间
  • 注:InnoDB不创建目录,所以在启动服务器之前请确认”所配置的路径目录”的确存在。

 

重启mysqld服务

[root@mysql ~]# systemctl restart mysqld
Job for mysqld.service failed because the control process exited with error
code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

mysqld启动失败,查看错误日志

[root@mysql ~]# tail -20 /usr/local/mysql/data/mysql.err
……
2020-01-06T17:42:28.309702Z 0 [ERROR] InnoDB: The Auto-extending innodb_system
data file '/usr/local/mysql/data/ibdata1' is of a different size 768 pages
(rounded down to MB) than specified in the .cnf file: initial 6400 pages, max 0
(relevant if non-zero) pages!
2020-01-06T17:42:28.309735Z 0 [ERROR] InnoDB: Plugin initialization aborted with
error Generic error
2020-01-06T17:42:28.612765Z 0 [ERROR] Plugin 'InnoDB' init function returned
error.
2020-01-06T17:42:28.612798Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE
ENGINE failed.
2020-01-06T17:42:28.612803Z 0 [ERROR] Failed to initialize builtin plugins.
2020-01-06T17:42:28.612805Z 0 [ERROR] Aborting
2020-01-06T17:42:28.612855Z 0 [Note] Binlog end
2020-01-06T17:42:28.612920Z 0 [Note] Shutting down plugin 'CSV'
2020-01-06T17:42:28.613151Z 0 [Note] /usr/local/mysql/bin/mysqld: Shutdown
complete

注:不同版本的mysql报错略有不同,注意看错误日志的内容。 从错误日志中显示可以看出 .cnf文件中设置6400页而当前ibdata1 为768页 需要计算768/64=12 修改配置为

root@mysql ~]# vim /etc/my.cnf
innodb_data_file_path=ibdata1:12M:autoextend #修改

重启mysqld服务

[root@mysql ~]# systemctl restart mysqld

注:计算公式:64pages相当于1M,1page是16KB 如果不清楚默认文件page大小,可以先 du-h ibdata1 查看下,再去设置;

这说明mysql5.7.13中ibdata初始化为12M 登录mysql执行mysql> show variables like’%innodb_file_per_table%’; 这时新建的表就会使用共享表空间了。

mysql> show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name     | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF  |
+-----------------------+-------+
1 row in set (0.01 sec)

3、Replication相关文件:
1)master.info 文件: master.info 文件存在于Slave 端的数据目下,里面存放了该 Slave 的Master端的相关信息,包括Master 的主机地址,连接用户,连接密码,连接端口,当前日志位置,已经读取到的日志位置等信息。
2)relay log 和relay log index mysql-relay-bin.xxxxxn 文件用于存放Slave 端的I/O 线程从Master 端所读取到的 Binary Log 信息,然后由Slave 端的SQL 线程从该relay log 中读取并解析相应的日志信息,转化成Master 所执行的SQL 语句,然后在Slave 端应用。 mysql-relay-bin.index 文件的功能类似于mysql-bin.index ,同样是记录日志的存放位置的绝对路径,只不过他所记录的不是Binary Log,而
是Relay Log。

3)relay-log.info 文件: 类似于master.info,它存放通过Slave 的I/O 线程写入到本地的relay log 的相关信 息。供Slave 端的SQL 线程以及某些管理操作随时能够获取当前复制的相关信息。

4、其他文件:
1)system config file MySQL 的系统配置文件一般都是my.cnf,默认存放在"/etc"目录下,my.cnf文件中包含多种参数选项(group),每一种参数组都通过中括号给定了固定的组名,如“[mysqld]”组中包括了mysqld服务启动时候的初始化参数,“[client]”组中包含着客户端工具程序可以读取的参数。
2)pid file
pid file 是mysqld 应用程序在Unix/Linux 环境下的一个进程文件,和许多其他 Unix/Linux 服务端程序一样,存放着自己的进程id。
3)socket file socket 文件也是在Unix/Linux 环境下才有的,用户在Unix/Linux 环境下客户端连接可以不通过TCP/IP 网络而直接使用Unix Socket 来连接MySQL。 mysql有两种连接方式,常用的一般是tcpmysql –h mysql主机ip -uroot -pxxx mysql -S /path /mysql.sock
注:采用unix socket连接方式,比用tcp的方式更快,但只适用于mysql和应用同在一台PC上。

你可能感兴趣的:(mysql,数据库,java)