yum install mariadb-server
/usr/libexec/mysqld: mariadb二进制文件
/usr/bin/mysql*: mariadb的配套工具
/usr/share/mysql: 字符集xml配置、语言包、初始化db的sql脚本、参考配置文件
/usr/lib64/mysql/plugin: 插件库
/etc/my.cnf: mariadb配置文件
/etc/my.cnf.d: mariadb子配置文件目录
### Step a.创建目录
[root@VM_32_32_centos ~]# mkdir /data/instance1/{data,log,log_bin,tmpdir}
### Step b.修改/etc/my.cnf
[mysqld]
datadir=/data/instance1/data
...
[mysqld_safe]
log-error=/data/instance1/log/mariadb.log
...
### Step c.修改/etc/my.cnf.d/server.cnf
[mysqld]
log_bin=/data/instance1/log_bin/binlog
sql_log_bin=on
sync_binlog=1
tmpdir=/data/instance1/tmpdir
slow_query_log=on
long_query_time=1
innodb_file_per_table=on
我们来观察一下数据目录结构:
|-- data # 数据目录
| |-- aria_log.00000001
| |-- aria_log_control
| |-- ibdata1
| |-- ib_logfile0
| |-- ib_logfile1
| |-- mysql # mysql系统库目录
| | |-- columns_priv.frm
| | |-- columns_priv.MYD
| | |-- columns_priv.MYI
| | |-- general_log.CSM
| | |-- general_log.CSV
| | |-- general_log.frm
| | |-- ...
| |-- performance_schema # performance_schema系统库目录
| | |-- cond_instances.frm
| | |-- db.opt
| | |-- events_waits_current.frm
| | |-- events_waits_history.frm
| | |-- ...
| |-- test # test库目录
| `-- VM_32_32_centos-slow.log # 慢查询日志
|-- log # 运行日志,错误日志也包含在里面
| `-- mariadb.log
|-- log_bin # binlog目录
| |-- binlog.000001
| `-- binlog.index
`-- tmpdir # 临时表目录
这里面的文件可以分为
查询语句:SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length + data_free) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;
该查询语句里面包含了数据块、索引块、已分配未使用的空闲空间。
- 对MyISAM引擎来说,index_length和data_length为表索引文件、数据文件的字节大小
- 对Innodb引擎来说,index_length和data_length为表和索引的近似字节数。data_free为表空间中已分配但未使用的字节数。例如在表中删除了一部分数据,这时候innodb仅会在文件中标识这些数据已删除,不会减少文件大小,这些空间在后续插入数据的时候可以重复使用,如果发现data_free很大时,可以通过optimize table命令缩容整理。因为绝大多数的业务来说都是使用innodb引擎,所以以上查询可以得到每个库的数据块、索引块、已分配未使用的空闲空间总和,并且实际文件大小会比这个值稍大一些。
整个数据库存储占用空间除了业务库目录文件大小外,还需要加上binlog、error log、redo log和系统自带库表和innodb共享表空间等占用大小。此外如果数据库当前的角色是从机的话,还需要加上relay log的大小。
场景1:业务使用CREATE TEMPORARY TABLE...语法创建临时表。当表的大小超过了参数指定的大小时,会使用临时文件存储。
场景2:在执行查询SQL时,根据生成的执行计划(explain查看),mysql会自动创建内部临时表.
内部临时表的创建条件:
- group by 和 order by中的列不相同
- order by列不是引用from表列表中的第一个表(驱动表)
- group by列不是引用from表列表中的第一个表(驱动表)
- 使用了sql_small_result选项
- 含有distinct的order by语句
相关参数:
- tmp_table_size
- sort_buffer_size
如果你发现数据库占用的存储空间出现突然性的上涨下跌,并且有查询变慢,但是业务并无大量insert数据时,可以从慢查询、SQL是否使用临时表上来分析优化。
原因:大事务产生的binlog太大。主要出现在对大表进行批量更新、删除等业务场景中,并且由于从机需要拉取该binlog进行回放,所以大事务会引起主备延迟上涨。建议在更新、删除的SQL中使用LIMIT子句,将更新删除分为多个事务执行,每次事务操作的数据不超过10w条。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。