MySql数据库(或者MySql服务器或者MySql实例)的文件类型主要有以下几种:
参数文件:告诉MySql实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还会介绍各种参数的类型。
日志文件:用来记录MySql实例对某种条件做出响应时写入的文件,如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。
socket文件:当用UNIX域套接字方式进行连接时需要的文件。
**pid文件:**MySql实例的进程ID文件。
MySql表结构文件:用来存放MySql表结构定义文件。
存储引擎文件:因为MySql存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据。这些存储引擎真正存储了记录和索引等数据。
MySql实例启动时,数据库会先去读取一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等。在默认情况下,MySql实例会按照一定的顺序在指定的位置进行读取,可以通过下面命令来寻找。
root@TryHard:~# mysql --help
下面是部分输出:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
MySql实例可以不需要参数文件,这时所有的参数值取决于编译MySql时指定的默认值和源代码中指定参数的默认值。
MySql数据库的参数文件是以文件方式进行存储的,可以直接通过文本编辑软件进行参数的修改。
可以把数据库参数看作是一个键值对(key/value)。比如下面的参数值为134217728,也就可以表示为innodb_buffer_pool_size=134217728。
mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)
通过下面的命令来查看数据库中所有的参数:
mysql> show variables;
或
mysql> select * from GLOBAL_VARIABLES;
可以通过使用like来查看某个特定的参数。
mysql> select * from GLOBAL_VARIABLES where variable_name like 'innodb_buffer%';
+------------------------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+------------------------------+----------------+
| INNODB_BUFFER_POOL_SIZE | 134217728 |
| INNODB_BUFFER_POOL_INSTANCES | 1 |
+------------------------------+----------------+
2 rows in set (0.00 sec)
show variables命令比较简单。
MySql数据库中的参数可以分为两类:
(1)动态参数
(2)静态参数
动态参数意味着可以在MySql实例运行中进行更改,静态参数意味着在整个实例的生命周期内都不能进行更改。
可以通过set命令对动态的参数值进行修改,下面是语法:
set global.system_var_name=value;
set session.system_var_name=value;
set @@global.system_var_name=value;
set @@session.system_var_name=value;
global和session关键字,它们表明该参数的修改是基于当前会话还是整个实例的生命周期。有些动态参数只能在会话中进行修改,如autocommit;而有些参数修改完后,在整个实例生命周期中都会生效,如binlog_cache_size;而有些参数既可以在会话中又可以在整个实例的生命周期内生效,如read_buffer_size。
即使在正实例生命周期中生效,但是如果重启数据库,它还是会从参数文件中读取参数的值。所以,如果想永久修改参数,则需要修改参数文件的内容。
静态变量不能修改,否则会出现下面的错误提示。
mysql> set global datadir='/db/mysql';
ERROR 1238 (HY000): Variable 'datadir' is a read only variable
MySql中常见的日志文件有:
(1)错误日志 error log
(2)二进制日志 binlog
(3)慢查询日志 slow query log
(4)查询日志log
- 错误日志
错误日志文件对MySql的启动、运行、关闭过程进行了记录。在遇到问题时应该首先查看该文件以便于定位问题。该文件不仅记录了所有的错误信息,也记录一些警告信息或正确的信息。
可以通过下面命令定位该文件:
mysql> show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| log_error | /var/log/mysql/error.log |
+---------------+--------------------------+
1 row in set (0.00 sec)
可以看到错误文件的路径和文件名。
下面是查看该文件最后20行:
root@TryHard:~# tail -n 20 /var/log/mysql/error.log
161204 17:24:14 InnoDB: Shutdown completed; log sequence number 2448358
161204 17:24:14 [Note] /usr/sbin/mysqld: Shutdown complete
161204 17:25:02 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
161204 17:25:02 [Note] Plugin 'FEDERATED' is disabled.
161204 17:25:02 InnoDB: The InnoDB memory heap is disabled
161204 17:25:02 InnoDB: Mutexes and rw_locks use GCC atomic builtins
161204 17:25:02 InnoDB: Compressed tables use zlib 1.2.8
161204 17:25:02 InnoDB: Using Linux native AIO
161204 17:25:02 InnoDB: Initializing buffer pool, size = 128.0M
161204 17:25:02 InnoDB: Completed initialization of buffer pool
161204 17:25:02 InnoDB: highest supported file format is Barracuda.
161204 17:25:03 InnoDB: Waiting for the background threads to start
161204 17:25:04 InnoDB: 5.5.49 started; log sequence number 2448358
161204 17:25:04 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
161204 17:25:04 [Note] - '127.0.0.1' resolves to '127.0.0.1';
161204 17:25:04 [Note] Server socket created on IP: '127.0.0.1'.
161204 17:25:04 [Note] Event Scheduler: Loaded 0 events
161204 17:25:04 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.49-0ubuntu0.14.04.1' socket: '/var/run/mysqld/mysqld.sock' port: 3306 (Ubuntu)
通过错误日志可能会获得关于数据库优化的信息,而慢查询日志可帮助DBA定位可能存在问题的SQL语句,从而进行SQL语句层面的优化。例如,可以在MySql启动时设一个阀值,将运行时间超过该值的所有Sql语句都记录到慢查询日志文件中。
DBA每天或每过一段时间对其进行检查,确认是否有Sql语句需要进行优化。该阀值可以通过参数long_query_time来设置,默认值为10,代表10秒。
在默认情况下,MySql数据库并不会启动慢查询日志,用户需要手动将这个参数设置为ON。
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| log_slow_queries | OFF |
+------------------+-------+
1 row in set (0.00 sec)
设置long_query_time这个阀值后,MySql数据库会记录运行时间超过该值的所有Sql语句,但运行时间正好等于long_query_time的情况并不会被记录下。
另一个和慢查询日志有关的参数是long_queries_not_using_indexes,如果运行的Sql语句没有使用索引,则MySql数据库同样会将这条Sql语句记录到慢查询日志文件。该参数默认是关闭的。
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
1 row in set (0.00 sec)
MySql数据库提供mysqldumpslow命令,该命令用来查看慢查询日志。
MySql5.1开始可以将慢查询的日志记录放入到表中,名为 slow_log,表结构如下,表的内容为空。
mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
Table: slow_log
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`query_time` time NOT NULL,
`lock_time` time NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)
mysql> select * from mysql.slow_log;
Empty set (0.00 sec)
参数log_output指定了慢查询输出的格式,默认为FILE,可以将它设置为TABLE,然后就可以查询slow_log表了。可以看到slow_log表的存储引擎为CSV,对大数据量下的查询效率可能不高,用户可以把slow_log表的引擎转换到MyISAM,并在start_time列下添加索引以进一步提高查询的效率。但是如果已经启动了慢查询,直接转换的话会出现错误,应该将其关闭,在改变存储引擎。
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global log_output='Table';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set (0.00 sec)
开启慢查询:
mysql> set global log_slow_queries='ON';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| log_slow_queries | ON |
+------------------+-------+
1 row in set (0.00 sec)
查询slow_log表内容:
mysql> select * from mysql.slow_log;
Empty set (0.00 sec)
执行一条睡眠10秒的Sql语句:
mysql> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
| 0 |
+-----------+
1 row in set (10.01 sec)
再次查看slow_log表:
mysql> select * from mysql.slow_log\G
*************************** 1. row ***************************
start_time: 2017-03-17 16:50:56
user_host: root[root] @ localhost []
query_time: 00:00:10
lock_time: 00:00:00
rows_sent: 1
rows_examined: 0
db:
last_insert_id: 0
insert_id: 0
server_id: 0
sql_text: select sleep(10)
1 row in set (0.00 sec)
可以看到刚才执行的Sql语句添加到了slow_log文件中。
MySql的slow_log通过运行时间来对Sql语句进行捕获,这是一个非常有用的优化技巧。但是当数据库的容量较小时,可能因为数据库刚建立,此时非常大的可能是数据全部缓存在缓冲池中,Sql语句运行的时间可能都是非常短的,一般都是0.5秒。
下面命令用来查看所有日志的信息,包括日志文件所在目录。
mysql> show global variables like '%log%';
+-----------------------------------------+---------------------------------+
| Variable_name | Value |
+-----------------------------------------+---------------------------------+
| back_log | 50 |
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| binlog_stmt_cache_size | 32768 |
| expire_logs_days | 10 |
| general_log | OFF |
| general_log_file | /var/lib/mysql/TryHard.log |
| innodb_flush_log_at_trx_commit | 1 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_mirrored_log_groups | 1 |
| log | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| log_error | /var/log/mysql/error.log |
| log_output | TABLE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 104857600 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_relay_log_size | 0 |
| relay_log | |
| relay_log_index | |
| relay_log_info_file | relay-log.info |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/TryHard-slow.log |
| sql_log_bin | ON |
| sql_log_off | OFF |
| sync_binlog | 0 |
| sync_relay_log | 0 |
| sync_relay_log_info | 0 |
+-----------------------------------------+---------------------------------+
41 rows in set (0.00 sec)
参数general_log_file定义了查询日志的文件名。
参数general_log表明查询日志是否开启,默认是off,因为查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。
二进制文件(binary log)记录了对MySql数据库执行更改的所有操作,但是不包括select和show这类操作,因为这类操作对数据本身并没有修改。然而,如果操作本身并没有导致数据库发生变化,那么该操作可能也会写入二进制日志。
查看二进制日志开启状态:
mysql> show global variables like "%log_bin%";
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
3 rows in set (0.00 sec)
log_bin为OFF,表示二进制日志没有开启。
mysql> show global variables like '%log%';
+-----------------------------------------+---------------------------------+
| Variable_name | Value |
+-----------------------------------------+---------------------------------+
| back_log | 50 |
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| binlog_stmt_cache_size | 32768 |
| expire_logs_days | 10 |
| general_log | OFF |
| general_log_file | /var/lib/mysql/TryHard.log |
| innodb_flush_log_at_trx_commit | 1 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_mirrored_log_groups | 1 |
| log | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| log_error | /var/log/mysql/error.log |
| log_output | TABLE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 104857600 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_relay_log_size | 0 |
| relay_log | |
| relay_log_index | |
| relay_log_info_file | relay-log.info |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/TryHard-slow.log |
| sql_log_bin | ON |
| sql_log_off | OFF |
| sync_binlog | 0 |
| sync_relay_log | 0 |
| sync_relay_log_info | 0 |
+-----------------------------------------+---------------------------------+
41 rows in set (0.00 sec)
sql_log_bin ={ON|OFF},
用于控制会话级别二进制日志功能的开启或关闭。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。
binlog_cache_size =32768
默认值32768 Binlog Cache用于在打开了二进制日志(binlog)记录功能的环境,是MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。
binlog_stmt_cache_size= 32768
当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句。
log_bin = mysql-bin
可以直接定义为文件路径,也可以为ON|OFF。
binlog-format= {ROW|STATEMENT|MIXED}
指定二进制日志的类型,默认为STATEMENT。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。
sync_binlog = 0
设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步。
max_binlog_cache_size= {4096 .. 18446744073709547520}
二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定。
max_binlog_stmt_cache_size= {4096 .. 18446744073709547520}
二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存。
expire_log_days ={0..99}
设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时。
二进制日志主要有以下几个作用:
(1)恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复。
(2)复制(recovery):其原理和恢复类似,通过复制和执行二进制日志使一台远程的MySql数据库(一般称为slave或standby)与一台MySql数据库(一般称为master或primary)进行实时同步。
(3)审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。
二进制日志定义方式:
其一、log_bin可以直接定义为文件路径,也可以为ON|OFF。
其二、通过编辑my.cnf中的log-bin选项可以开启二进制日志;
形式如下:
[root@stu18 ~]#my.cnf
[mysqld]
log-bin [=DIR \ [filename]]
其中,DIR参数指定二进制文件的存储路径;filename参数指定二级制文件的文件名,其形式为filename.number,number的形式为000001、000002等。每次重启mysql服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增。除了生成上述的文件外还会生成一个名为filename.index的文件。这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。
通过查看log_bin发现没有开启二进制日志:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
对文件/etc/mysql/my.cnf进行编辑,将log_bin的注释去掉,如下图
重新启动mysql服务器:
root@TryHard:~# mysqld start
170317 18:52:16 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
170317 18:52:16 [Note] mysqld (mysqld 5.5.49-0ubuntu0.14.04.1-log) starting as process 31651 ...
重新查看log_bin:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
以下配置文件的参数影响着二进制日志文件的信息和行为:
max_binlog_size, binlog_cache_size, sync_binlog, binlog-do-db, binlog-ignore-db, log-slave-update, binlog_format.
参数max_binlog_size指定了单个二进制日志文件的最大值,如果超过该值,则产生新的二进制日志文件,记录到.index文件。bin_log.index为二进制的索引文件,用来存储之前产生的二进制日志序号。
mysql> show variables like 'max_binlog_size';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| max_binlog_size | 104857600 |
+-----------------+-----------+
1 row in set (0.00 sec)
当使用事务的表存储引擎(如InnoDB存储引擎)时,所有未提交的二进制日志会被记录到一个缓存中,等该事务提交时直接将缓冲中的二进制日志写入二进制日志文件,而该缓冲的大小由binlog_cache_size决定,默认大小为32K。
mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)
binlog_cache_size是基于会话的,也就是说,当一个线程开始一个事务时,MySql会自动分配一个大小为binlog_cache_size的缓存,因此该值的设置需要相当消息,不能设置太大。当一个事务的记录大于设定的binlog_cache_size时,MySql会把缓冲中的日志写入一个临时文件中,因此该值也不能设置得太小。
通过下面的命令查看binlog_cache_use,binlog_cache_disk_use的状态,可以判断当前binlog_cache_size的设置是否合适。
mysql> show global status like 'binlog_cache%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 0 |
+-----------------------+-------+
2 rows in set (0.00 sec)
Binlog_cache_use记录了使用缓冲写二进制日志的次数,Binlog_cache_disk_use记录了使用临时文件写二进制日志的次数。
在默认情况下,二进制日志并不是在每次写的时候同步到磁盘(用户可以理解为缓冲写)。因此,当数据库所在操作系统发生宕机时,可能会有最后一部分数据没有写入二进制文件中,这会给恢复和复制带来问题。参数sync_binlog=[N]表示每写缓冲多少次就同步到磁盘。如果将N设为1,即sync_binlog=1表示采用同步磁盘的方式来写二进制日志,这时写操作不使用操作系统的缓冲来写二进制日志。sync_binlog的默认值为0,如果使用InnoDB存储引擎进行复制,并且想得到最大的高可用性,建议将该值设置为ON。不过该值为ON时,会对数据库的IO系统带来一定的影响。
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 0 |
+---------------+-------+
1 row in set (0.00 sec)
即使将sync_binlog设置为1,还是会有一种情况导致问题的发生。当使用InnoDB存储引擎时,在一个事务发出COMMIT动作之前,由于sync_binlog=1,因此会将二进制日志立即写入磁盘。如果这时已经写入了二进制日志,但是提交还没有发生,并且此时发生了宕机,那么在MySql数据库下次启动时,由于COMMIT操作并没有发生,这个事务会被回滚掉。但是二进制日志已经记录了该事务信息,不能被回滚。这个问题可以通过将参数innodb_support_xa设置为1来解决,innodb_support_xa和XA事务有关,它同时也确保了二进制日志和InnoDB存储引擎数据文件的同步。
参数binlog-do-db和binlog-ignore-db表示需要写入或忽略写入哪些库的日志。默认为空,表示需要同步所有库的日志到二进制日志。
如果当前数据库是复制中的slave角色,则它不会将从master取得并执行的二进制日志写入自己的二进制日志文件中去。如果需要写入,要设置log-slave-update。如果需要搭建maste=>slave=>slave架构的复制,则必须设置该参数。
参数binlog_format影响了记录二进制日志的格式。
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
在MySql5.1 版本之前,没有这个参数。所有二进制文件的格式都是基于SQL语句(statement)级别的,因此基于这个格式的二进制日志文件的复制(Replication)和Oracle的逻辑Standby有点相似。同时,对于复制有一定的要求。
MySql5.1开始引入了binlog_format参数,该参数的值为STATMENT,ROW,MIXED。
(1)STATEMENT格式和之前的MySql版本一样,二进制日志文件记录的是日志的逻辑Sql语句。
(2)在ROW格式下,二进制日志记录的不再是简单的Sql语句了,而是记录表的行更改情况。如果设置了ROW格式,可以将InnoDB的事务隔离基本设为READ COMMITTED,以便获得更好的并发性。
(3)在MIXED格式下,MySql默认采用STATEMENT格式进行二进制日志文件的记录,但是在一些情况下会使用ROW格式,可能的情况有:
1. 表的存储引起为NDB,这时对表的DML操作都会以ROW格式记录。
2. 使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_COUNT()等不确定函数。
3. 使用了INSERT_DELEY语句;
4. 使用了用户定义函数(UDF)
5. 使用了临时表(temporary table)
binlog_format是动态参数,因此可以在数据库运行环境下进行更改。
二进制日志文件的文件格式为二进制,不能像错误日志文件,慢查询日志文件一样用cat,head,tail等命令来查看。要查看二进制日志文件的内容,必须通过MySql提供的工具mysqlbinlog。
在Unix系统下本地连接MySql可以采用UNIX域套接字方式,这种方式需要一个套接字文件。套接字文件可以由参数socket控制。
mysql> show variables like 'socket';
+---------------+-----------------------------+
| Variable_name | Value |
+---------------+-----------------------------+
| socket | /var/run/mysqld/mysqld.sock |
+---------------+-----------------------------+
1 row in set (0.01 sec)
当MySql实例启动时,会将自己的进程ID写入一个文件中——该文件就是pid文件。
mysql> show variables like 'pid_file';
+---------------+----------------------------+
| Variable_name | Value |
+---------------+----------------------------+
| pid_file | /var/run/mysqld/mysqld.pid |
+---------------+----------------------------+
1 row in set (0.00 sec)
因为MySql插件式存储引擎的体系结构的关系,MySql数据的存储是根据表进行的,每个表都会有与之对应的文件。但不论表采用哪种存储引擎,MySql都有一个以frm为后缀名的文件,这个文件记录了该表的表结构定义。
frm还用来存放视图的定义,如用户创建了一个v_a视图,那么对应地产生一个v_a.frm文件,用来记录视图的定义,该文件是文本文件,可以直接使用cat命令进行查看。