日志
MySQL日志记录了MySQL数据库日常操作和错误信息。MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户的操作、错误的信息等。
MySQL日志分为4大类
1. 错误日志:记录mysql服务的启动,运行或停止mysql服务时出现的问题
2. 查询日志:记录建立的客户端的连接和执行的语句
3. 二进制日志:记录所有更改数据的语句,可以用于数据的复制
4. 慢查询日志:记录所有执行的时间超过long_query_time的所有查询或不使用索引的查询
默认情况下,所有日志创建与MySQL数据目录中,通过刷新日志,可以强制MySQL关闭和重新打开日志文件,Flush logs刷新日志或者执行mysqladmin flush-logs 如果正使用MySQL复制功能,在复制服务器上可以维护更多日志文件,这种日志我们称为接替日志。启动日志功能会降低MySQL数据库的性能。
错误日志:Error Log
在mysql数据库中,错误日志功能是默认开启的。默认情况下,错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动
InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息 注1:MySQL有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同。因此mysql提供两组命令,分别查看系统设置和运行状态。
1.查看系统设置
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] SHOW VARIABLES: shows the values of MySQL system variables.
2.运行状态
SHOW [GLOBAL | SESSION] STATUS [like_or_where] SHOW STATUS: provides server status information.
如何修改系统配置
方法1:配置文件设置my.cnf 如:binlog_cache_size = 1M
方法2:set global binlog_cache_size = 1048576;
查看mysql的版本
[root@localhost ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrapper
或
mysql> status;
--------------
mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrapper
Connection id: 5
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.28 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: 1 hour 12 min 8 sec
Threads: 1 Questions: 10 Slow queries: 0 Opens: 106 Flush tables: 1 Open
tables: 99 Queries per second avg: 0.002
--------------
或
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.32 |
+-----------+
1 row in set (0.00 sec)
一般而言,日志级别的定义没有会话变量都只是在全局级别下进行定义 错误日志的状态:
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.00 sec)
其中 log_error定义为错误日志文件路径 log_error_verbosity:
Verbosity Value | Message Types Logged |
---|---|
1 | Errors only |
2 | Errors and warnings |
3 | Errors, warnings, and notes (default) |
更改错误日志位置可以使用log-error来设置形式如下
[root@mysql ~]# vim /etc/my.cnf
log-error=/usr/local/mysql/data/mysql.err
查看mysql错误日志:
[root@mysql ~]# tail -f /usr/local/mysql/data/mysql.err
为了方便维护需要,有时候会希望将错误日志中的内容做备份并重新开始记录,这时候就可以利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。 删除错误日志: 在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –p flush-logs也可以登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。 在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的:方式如下:
# mv mysql.err mysql.old
# mysqladmin -uroot -p flush-logs
Enter password:
更多信息请查阅官方文档: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/errorlog.html
二进制日志:
主要记录MySQL数据库的变化,二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据。二进制日志还包含关于每个更新数据库的语句的执行时间,它不包含没有修改任何数据的语句。使用二进制日志的主要目的是最大可能地恢复数据库。
启动二进制日志,默认情况下二进制日志是关闭的 编辑配置文件My.ini 或my.cnf
[root@localhost ~]# vim /etc/my.cnf
添加:
log_bin=mysql.bin
server_id=1
重启mysql
Show variables 或show variables like ‘log_%’; 语句来查询日志设置
mysql> show variables like 'log_%';
+---------------------------------+-----------------------------------------------
--+
| Variable_name | Value
|
+---------------------------------+-----------------------------------------------
--+
| log_bin | ON
|
| log_bin_trust_function_creators | OFF
|
| log_error |
/usr/local/mysql/data/localhost.localdomain.err |
| log_output | FILE
|
| log_queries_not_using_indexes | OFF
|
| log_slave_updates | OFF
|
| log_slow_queries | OFF
|
| log_warnings | 1
|
+---------------------------------+-----------------------------------------------
--+
8 rows in set (0.00 sec)
查看二进制日志
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.000017 | 197 |
| mysql.000018 | 197 |
| mysql.000019 | 197 |
| mysql.000020 | 154 |
+--------------+-----------+
4 rows in set (0.00 sec)
查看二进制日志的内容
退出mysql在命令行
[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# mysqlbinlog mysql.000017
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE
DELIMITER /*!*/;
#at 4
#210104 14:47:01 server id 1 end_log_pos 123 CRC32 0x09440f51 Sta
BINLOG
........省略
删除二进制日志
MySQL的二进制文件可以配置自动删除,同时MySQL提供了手动删除二进制文件的方法:
RESET MASTER 删除所有的二进制日志文件;PURGE MASTER LOGS只删除部分二进制日志文件。 Resetmaster; 删除所有二进制日志 Purge master logs to ‘二进制名’ 删除单个二进制日志之前的
mysql> flush logs
mysql> purge master logs to "mysql.000018";
Query OK, 0 rows affected (0.02 sec)
Purge binary logs before ‘date’ 删除指定日期之前的日志
mysql> purge master logs before '2021-1-14 14:49:10';
Query OK, 0 rows affected (0.07 sec)
还原
如果MySQL服务器启用了二进制日志,使用二进制日志还原数据库 使用最后一次备份还原,或指定一个时间恢复数据 Mysqlbinlog [option]日志文件名filename mysql –uuser -ppass [option]里面的选项 --startdate开始的时间–stop-position结束的位置
[root@localhost mysql]# mysqlbinlog --start-date='2018-02-10 17:27:48'
/usr/local/mysql/data/mysql-bin.000012 | mysql -uroot -p123.com
暂时停止二进制日志的功能
如果MySQL的配置文件已经启动了二进制日志,MySQL会一直记录二进制日志,修改配置文件,可以停止二进制日志,但是需要重启MySQL数据库。MySQL提供了暂时停止二进制日志的功能,通过SET SQL_LOG_BIN语句可以使MySQL暂时停止二进制
mysql> set sql_log_bin =0; // 0暂停 1恢复
Query OK, 0 rows affected (0.00 sec)
事务日志(或称redo日志)
事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的。 如果数据的修改已经记录到事务日
志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
查看事务日志的定义:
mysql> show global variables like '%log%';
按分类设置事务日志的值
[root@mysql ~]# vim /etc/my.cnf
添加:
innodb_flush_log_at_trx_commit= 2 //1或0或2,三个值
显示结果:
| innodb_flush_log_at_timeout | 1
| innodb_flush_log_at_trx_commit | 1
在事务提交时innodb是否同步日志从缓冲区到文件中,
当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁
盘操作的刷新,性能会很差造成大量的磁盘I/O但这种方式最安全;
如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用
了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁
盘。
设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。
注:刷写的概念
刷写其实是两个操作,刷(flush)和写(write),区分这两个概念是很重要的。在大多数的操作系
统中,把Innodb的log buffer(内存)写入日志(调用系统调用write),只是简单的把数据移到操
作系统缓存中,操作系统缓存同样指的是内存。并没有实际的持久化数据。
所以,通常设为0和2的时候,在崩溃或断电的时候会丢失最后一秒的数据,因为这个时候数据只是存在
于操作系统缓存。之所以说“通常”,可能会有丢失不只1秒的数据的情况,比如说执行flush操作的时
候阻塞了。
总结
设为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名称存在
慢日志查询: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/localhost-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)
启动和设置慢查询日志:
方法1:通过配置文件my.cnf开启慢查询日志:
注:在不同的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/localhost-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文件:
[mysqld]
slow_query_log=1
slow_query_log_file=/usr/local/mysql/data/mysql-slow.log
重启mysqld服务 再次查询慢查询日志定义
方法2:通过登录mysql服务器直接定义,方式如下:
mysql> set global slow_query_log=1; #开启慢查询日志
Query OK, 0 rowsaffected (0.35 sec)
mysql>set session long_query_time=0.0001; #更改时间(当前session中,退出则重置)
Query OK, 0 rowsaffected (0.00 sec)
mysql>set global long_query_time=0.0001; #更改时间(全局中,重启服务则重置)
mysql> SHOW VARIABLES LIKE 'long%'; #查询定义时间
查看慢查询日志
mysql> use mysql
mysql> selectuser,host from user where user="root";
或用系统查看文件内容命令如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@日志中的时间戳
以看到查询进行的同时记录了该日志 ,但是对于一台超负载的服务器常常并非如此。因此记住:SET timestamp= value 才是实际的查询的执行时间。
慢查询分析mysqldumpslow 们可以通过打开log文件查看得知哪些SQL执行效率低下。从日志中,可以发现查询时间超过long_query_time时间的query为慢查询,而小于long_query_time时间的没有出现在此日志中。 如果慢查询日志中记录内容很多,可以使用mysqldumpslow工具(MySQL客户端安装自带)来对慢查询日志进行分类汇总mysqldumpslow对日志文件进行了分类汇总,显示汇总后摘要结果 进入log的存放目录,运行
[root@localhost data]# mysqldumpslow mysqld-slow.log
注: 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条里面含有左连接的查询语句。
数据文件
在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL 存储引擎有各自不同的数据文件。如MyISAM 用“.MYD”作为扩展名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等。
登录mysql,创建一个数据库如testdb,并在数据库中创建一个表,如下图所示:
查看数据库所在目录会发现数据目录下存在一个以数据库名字命名的文件夹
查看testdb目录的文件列表
从上图可以看出表使用的是innodb存储引擎。 以myisam存储引擎创建一个测试表tb2
查看数据库目录
注:修改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)
ON代表独立表空间管理,OFF代表共享表空间管理;(查看单表的表空间管理方式,需要查看每个表是否有单独的数据文件)
Innodb共享表空间配置: 修改my.cnf文件:
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服务
mysqld启动失败,查看错误日志
#tail -20 /usr/local/mysql/data/mysqld.err
显示内容如下:
2019-12-29T06:53:44.635783Z 0 [ERROR] InnoDB: The Auto-extending innodb_system
data file '/usr/local/mysql/data/ibdata1' is of a different size 4864 pages
(rounded down to MB) than specified in the .cnf file: initial 6400 pages, max 0(relevant if non-zero) pages!
注:不同版本的mysql报错略有不同,注意看错误日志的内容。 从错误日志中显示可以看出
在/etc/my.cnf文件中设置6400页而当前ibdata1为4864页 需要计算4864/64=76 修改配置为
innodb_data_file_path=ibdata1:76M:autoextend
重启mysqld服务
启动mysql,成功!
注:计算公式:64pages相当于1M,1page是16KB 如果不清楚默认文件page大小,可以先 du -h ibdata1 查看下,再去设置;
这说明mysql5.7.13中ibdata初始化为12M 登录mysql执行mysql> show variables like ‘%innodb_file_per_table%’;
这时新建的表就会使用共享表空间了。
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 线程以及某些管理操作随时能够获取当前复制的相关信息。
其他文件:
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有两种连接方式,常用的一般是tcp mysql –h mysql主机ip -uroot -pxxx mysql -S /path /mysql.sock
注:采用unix socket连接方式,比用tcp的方式更快,但只适用于mysql和应用同在一台PC上。