【问题标题】:Where does mysql store data?mysql在哪里存储数据?
【发布时间】:2014-10-16 11:08:52
【问题描述】:

mysql在哪里存储数据?我发现(通过使用 mysql>SELECT @@datadir )它在 var/lib/mysql 中 - 但那不可能。我有一个名为“bot”的相当大的数据库(4 GB),但“bot”子目录(var/lib/mysql/bot)中的所有文件只有 280KB。剩下的在哪里?

还有一件事 - 99% 的数据库大小是其中一个表中的文本列 - 我知道 mysql 将其存储在单独的文件中,但它是否为每条记录创建一个文件?

我在 var/lib/mysql 目录中发现了一个名为 ibdata1 的大文件 - 它的大小超过 8GB - 它是什么? (顺便说一句,在 var/lib/mysql 目录下还有其他数据库)。

【问题讨论】:

  • 你用的是什么存储引擎?

标签: mysql


【解决方案1】:

来自here

Windows

  1. 找到存储在 MySQL 安装文件夹中的 my.ini。

例如,C:\Program Files\MySQL\MySQL Server 5.1\my.ini

  1. 使用我们喜欢的文本编辑器打开“my.ini”。
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
 
#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"

找到“datadir”,这是 MySQL 在 Windows 中存储数据的位置。


Linux

  1. 使用 find / -name my.cnf 命令找到 my.cnf。
yongmo@myserver:~$ find / -name my.cnf
find: /home/lost+found: Permission denied
find: /lost+found: Permission denied
/etc/mysql/my.cnf
  1. 像这样查看my.cnf文件:cat /etc/mysql/my.cnf
yongmo@myserver:~$ cat /etc/mysql/my.cnf
#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
# 
[mysqld]
#
# * Basic Settings
#
user   = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket  = /var/run/mysqld/mysqld.sock
port   = 3306
basedir  = /usr
datadir  = /var/lib/mysql
tmpdir  = /tmp
language = /usr/share/mysql/english
skip-external-locking
  1. 找到“datadir”,这是MySQL在Linux系统中存储数据的地方。

【讨论】:

  • 谢谢,但我相信你只看了我的问题的标题,我完全按照你的描述做了,但正如我在帖子本身中所写:“mysql 在哪里存储数据?我发现(通过使用 mysql>SELECT @@datadir )它在 var/lib/mysql 中 - 但那不可能。我有一个相当大的数据库(4 GB),称为 'bot',但所有文件都在 'bot' 子目录中(var/lib/mysql/bot) 只有 280KB。剩下的在哪里?”
  • 所以找到数据目录并找到最大的文件或文件集,这并不难。另外,请查看发布的其他答案。
  • 正如我所写,我找到了“ibdata1”文件,但它在主目录中,而不是在数据库的子目录中,所以对我来说这似乎是我正在寻找的文件.
  • 您可以像这样确定数据目录,而不是在整个文件系统上使用“find”:mysqld --verbose --help | grep 数据目录
  • 在我的情况下,安装文件夹中没有“my.ini”文件。我正在使用 MySQL 8.0 和 windows
【解决方案2】:

至少在 5.6 版中,MySQL Workbench 中的管理选项卡显示它位于 C:\ 驱动器中名为 ProgramData 的隐藏文件夹中。我的默认数据目录是

C:\ProgramData\MySQL\MySQL 服务器 5.6\data

。每个数据库都有一个文件夹,每个表在这里都有一个文件。

【讨论】:

    【解决方案3】:

    字里行间-这是一个innodb数据库吗?在这种情况下,实际数据通常以名称 ibdata1 存储在该目录中。此文件包含您的所有表,除非您专门设置 mysql 使用每个表一个文件 (innodb-file-per-table)

    【讨论】:

    • 谢谢!确实我忘了提到它是innodb。您说文件(ibdata1)“包含所有表”,但看起来它实际上包含所有数据库中的所有表?你知道这是否有原因吗?这似乎很愚蠢......还有一件事 - 当数据库已经存在并包含记录时,我现在可以更改此选项(innodb-file-per-table)吗?
    • 是的,抱歉应该说所有数据库。在这里dba.stackexchange.com/questions/15531/… 并不是很愚蠢。只能通过停止 mysql,更改选项,然后重新启动来更改此选项。抱歉,我从未尝试将 innodb 拆分出来,我建议使用 mysqldump 备份 DB,更改选项,然后重新加载 DB。
    • 谢谢!我一定会的。
    【解决方案4】:

    我刚刚在Windows 10 上安装了MySQL Server 5.7my.ini 文件位于此处c:\ProgramData\MySQL\MySQL Server 5.7\my.ini

    Data 文件夹(创建您的数据库的位置)在此处C:/ProgramData/MySQL/MySQL Server 5.7\Data

    【讨论】:

    • 使用这个我能够解决“mysql.connector.errors.DatabaseError: 1007 (HY000)”。
    【解决方案5】:

    在 mysql server 8.0 中,在 Windows 上,位置是C:\ProgramData\MySQL\MySQL Server 8.0\Data

    【讨论】:

      【解决方案6】:

      正如@PhilHarvey 所说,您可以使用mysqld --verbose --help | grep datadir

      【讨论】: