在将一个数据库转换为使用 InnoDB 引擎后,我只是在 /etc/mysql/my.cnf 中添加了以下几行。
innodb_buffer_pool_size = 2560M
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 16
innodb_flush_method = O_DIRECT
Run Code Online (Sandbox Code Playgroud)
但它在第 2 行引发“ERROR 2013 (HY000): Lost connection to MySQL server during query”错误重启mysqld。并且mysql错误日志显示如下
InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 268435456 bytes!
100118 20:52:52 [ERROR] Plugin 'InnoDB' init function returned error.
100118 20:52:52 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
100118 20:52:52 [ERROR] …Run Code Online (Sandbox Code Playgroud) 我最近从以前的 LTS Ubuntu 升级到 Precise,现在 mysql 拒绝启动。当我尝试启动它时,它会抱怨以下内容:
?$ sudo service mysql restart
stop: Unknown instance:
start: Job failed to start
Run Code Online (Sandbox Code Playgroud)
这显示在“/var/log/mysql/error.log”中:
120415 23:01:09 [Note] Plugin 'InnoDB' is disabled.
120415 23:01:09 [Note] Plugin 'FEDERATED' is disabled.
120415 23:01:09 [ERROR] Unknown/unsupported storage engine: InnoDB
120415 23:01:09 [ERROR] Aborting
120415 23:01:09 [Note] /usr/sbin/mysqld: Shutdown complete
Run Code Online (Sandbox Code Playgroud)
我已经检查了所有 mysql 目录的权限以确保它拥有所有权,并且我还重命名了之前的 ib_logs 以便它可以重新制作它们。在查看了 2 个小时的谷歌结果后,我现在对这个问题一无所知。
默认情况下,MySQL InnoDB 将所有数据库的所有表存储在一个全局文件中。您可以通过在配置中设置 innodb_file_per_table 来更改这一点,然后为每个表创建一个数据文件。
我想知道为什么innodb_file_per_table默认情况下不启用。使用它有什么缺点吗?
我们的生产 mysql 服务器刚刚崩溃并且无法恢复。它给出了段错误。我尝试了重新启动,只是不知道还能尝试什么。这是堆栈跟踪:
140502 14:13:05 [注意] 插件“联邦”被禁用。 InnoDB:日志扫描已通过检查点 lsn 108 1057948207 140502 14:13:06 InnoDB:数据库没有正常关闭! InnoDB:启动崩溃恢复。 InnoDB:从 .ibd 文件中读取表空间信息... InnoDB:从双写恢复可能的半写入数据页 InnoDB:缓冲... InnoDB:进行恢复:扫描到日志序列号 108 1058059648 InnoDB:必须回滚或清理的 1 个事务 InnoDB:总共需要撤消 15 行操作 InnoDB:Trx id 计数器为 0 562485504 140502 14:13:06 InnoDB:开始将一批日志记录应用到数据库... InnoDB:百分比进度:4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 4 3 4 3 4 3 4 3 4 3 4 48 49 …
在设置 MySQL 以提高性能方面,我是一个非常大的菜鸟。老实说,我并不担心从 MySQL 中挤出最后一点性能的微调,但我知道提供一些最佳结果的最重要的事情是正确设置缓存/缓冲区。
我试图通过仅使用 InnoDB 作为存储引擎来保持简单。而且我确实有一个用于 MySQL 的专用服务器。它有 8GB 的 RAM,我应该如何分配它以最大限度地提高性能?我希望能够将我的整个数据库放入内存以获得最佳性能。数据库大约5GB。这可能吗?
我应该为查询缓存分配多少内存?InnoDB 缓冲池多少钱?计算机的其余部分(即非 MySQL 相关进程)多少钱?等等。
由于我没有使用 MyISAM,所以我真的不需要在密钥缓存中放入大量内存,对吗?
我需要定期更改 mysql 5.1 中的表,主要是添加列。使用 alter table 命令非常简单。但是我的表现在有多达 4000 万行,而且它们增长得很快……所以那些 alter table 命令需要几个小时。几个月后,我猜他们会花几天时间。
由于我使用的是 amazon RDS,因此我无法使用从服务器然后升级为主服务器。所以我的问题是是否有办法以最少的停机时间做到这一点?如果用户仍然可以使用数据库,我不介意花费数小时甚至数天的操作......他们至少可以在添加列时阅读吗?如果我的应用尝试写入会发生什么?插入还是更新?如果它立即失败,那实际上并没有那么糟糕,如果它只是挂起并导致数据库服务器出现问题,那就是一个大问题..
这一定是一个相当普遍的缩放问题,每个人都需要添加列.. 通常对生产数据库做什么?从 -> 主迁移?
更新- 我忘了提到我正在使用 innodb 存储引擎
我使用 MySQL 作为我当前 Web 项目的数据库。我是 MySQL 的新手。请向我解释 InnoDB 和 MyISAM 之间的区别。
我发现许多网站都在谈论这样做,但我遗漏了一些重要的细节。一般步骤是
FLUSH TABLES WITH READ LOCKUNLOCK TABLES各种消息来源报告说,我正在使用的 InnoDB 实际上并不支持FLUSH. MySQL 用户手册指出有一个FLUSH TABLES...FOR EXPORT用于 InnoDB的变体,但这需要单独指定每个表,而不是备份整个数据库。我宁愿避免单独指定每个表,因为表列表很有可能与实际存在的表不同步。
我遇到的另一个问题是我计划做类似mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK". 但是,这会在会话退出后立即解除锁定。这是有道理的,但也很烦人,因为我在拍摄快照时需要持有读锁。
我的另一个想法是使用 Percona XtraBackup 之类的工具进行热备份并拍摄备份快照,但我不想支付将所有数据写入第二个位置只是为了快照它的成本。
特别是,当 MyISAM 和 InnoDB 都没有缺少必需的功能(例如,您不需要外键)时,您如何在两者之间进行选择。
它总是归结为尝试和测量吗?或者是否有关于读取与写入的数量和频率以及其他类似措施的良好经验法则?表的大小对典型选择有影响吗?
这个问题也可能在 StackOverflow 上被问到,但我会先在这里尝试......
我们数据库中 INSERT 和 UPDATE 语句的性能似乎正在降低并导致我们的 Web 应用程序性能不佳。
表是 InnoDB 并且应用程序使用事务。是否有任何简单的调整可以加快速度?
我想我们可能会看到一些锁定问题,我怎样才能找到?