您好,我错误地从基于 Windos XP 的 PC 中删除了我的 MySQL 数据库(该数据库用于使用 Xampp 包托管 Wiki 服务)。现在我正在尝试恢复数据,以便我至少可以检索在 Mediawiki 包的相应表中输入的文本。
删除后,我尝试使用 Minitool 数据恢复软件恢复数据,并且能够恢复包含 .frm 文件、ib_logfile0、ib_logfile1 和 ibdata1(存储在 C>xampp>mysql>data 下)的主模式文件夹。
现在我正在尝试恢复数据库,以便我可以获取 SQL 转储并相应地使用它。我查阅了专家之前提供的一些建议。以下是链接 -
但这些对我没有多大帮助,不确定我从说明中到底遗漏了什么。最后我无法启动 MySQL 服务,并且失败,日志中出现以下错误 -
120823 12:17:04 [Note] Plugin 'FEDERATED' is disabled.
120823 12:17:04 InnoDB: The InnoDB memory heap is disabled
120823 12:17:04 InnoDB: Mutexes and rw_locks use Windows interlocked functions
120823 12:17:04 InnoDB: Compressed tables use zlib 1.2.3
120823 12:17:04 InnoDB: Initializing buffer pool, size = …Run Code Online (Sandbox Code Playgroud) 每周都会触发一个 cronjob,从使用 InnoDB 引擎的 MySQL 表中删除大约 500,000 条记录。该表包含每周处理的网络日志数据,之后不再需要的数据将被删除。这个表有 3 个索引(没有外键),包括 time,它是一个 unix 时间戳。
从 global_viewlog 中删除时间<1354391592
问题是上周运行的这个查询需要 2 个多小时才能运行,在此期间我的整个服务器都在滞后。'iotop' 揭示了被 MySQL 引用大量写入的硬盘,服务器负载急剧增加到不健康的水平。
每次点击都会写入表格。房间里有没有我没看到的大象?即,优化这个每周查询的一些显而易见的事情?
谢谢
据我所知,MySQL 中的 InnoDB 表,所有事务都用 START TRANSACTION 包装;并以 COMMIT 结束;除非明确说明不这样做。
如果我要明确定义交易块,这样做是否正确:
SET AUTOCOMMIT = 0;
START TRANSACTION;
[SQL STATEMENTS]
COMMIT;
SET AUTOCOMMIT = 1;
Run Code Online (Sandbox Code Playgroud)
此后的下一个事务会回到 InnoDb 默认处理事务的方式吗?我的目的是有时在我的应用程序中明确定义事务,但所有其他事务将由引擎处理。
Jeremy Cole 的演讲《InnoDB:核心之旅 II》似乎表明有 128 个插槽,每个插槽可以有 1024 个事务。因此,我将记录在日志文件中的更新硬性限制为 2^17 次。
我正在寻找一种方法来从 ibdata1 和 ib_logfile[01] 文件中的撤消和重做日志轮换更新。如果我可以静态地或从配置动态地确定撤消和重做日志条目的最大数量是多少,那么我可以强制对系统进行大量更新,从而轮换出我试图删除的数据文件。
如果 Jeremy Cole 可以从字面上理解,则 131,072 次更新应该轮换出记录中列的原始值。或者比这更复杂?
我在 MySql 数据库中的一个表上创建了一个 FULLTEXT 索引,并在我这样做时遗漏了一列。我一直在尝试弄清楚如何添加此列,以便可以与此表中已编入索引的其他列一起对其进行搜索。
我已经搜索过 SO 和网络,但一无所获。我尝试进入 phpMyAdmin,当您单击表格然后查看结构时,一直在右侧有一个下拉菜单,上面写着“更多”。这有一个“全文”选项,似乎向列添加全文索引,所以我这样做了,但它仍然不允许我搜索列。
我是否在此列中添加了 FULLTEXT?无论哪种方式,我如何才能让它发挥作用?
好的,首先,我跑了
locate my.cnf
哪个给了
/etc/mysql/my.cnf
这也是 mysqld 设置的默认配置位置
然后编辑my.cnf在[mysql]下添加的文件
[mysql]
innodb_force_recovery = 3
Run Code Online (Sandbox Code Playgroud)
然后重新启动mysqld并尝试登录 mysql -u root -p
我收到一个错误说
mysql: unknown variable 'innodb_force_recovery=3'
Run Code Online (Sandbox Code Playgroud)
也在跑步 show variables
我看到这个领域
innodb_force_recovery = 0
我正在使用 MySQL 5.5.44
发生这种情况有什么特殊原因吗?
如果有人帮助我,我将非常感激。我花了大约 8 个小时谷歌搜索,没有找到解决问题的方法。
我在 Windows Server 2008 R2 上有 MySQL 服务器版本 5.7.7
表引擎是innodb
innodb_file_per_table = 1
当表达到 4Gb 时,我收到错误“表已满”。MySQL 文档称,表大小实际上只有一个限制,即文件系统。(http://dev.mysql.com/doc/refman/5.7/en/table-size-limit.html)
存储数据的硬盘使用 NTFS,只是为了确保我创建的 5Gb 文件没有问题。并且肯定有超过 10Gb 的可用空间。
我知道如果启用“innodb_file_per_table”,设置“innodb_data_file_path”是无关紧要的,但我尝试设置它。没有差异。我尝试过干净安装mysql。相同的结果。
编辑
在我之前安装 MySQL 服务器的人不小心安装了 32 位版本。迁移到 64 位 mysql 解决了这个问题
我是SQL的新手,我使用的是MySQL,我有一个包含博客的表.在该表中,我有一个名为"blog_category"的列.我试图从blog_category返回至少出现(n)次的DISTINCT值.例:
blog_category
-------------
category_1
category_1
category_2
category_3
category_3
category_4
category_4
category_1
category_1
category_2
category_2
Run Code Online (Sandbox Code Playgroud)
我只想返回出现的类别,至少3次(大于或等于3).
我可以使用DISTINCT关键字显示那些不仅仅出现一次的那些,但我只想要那些实际出现超过指定次数的那些,在这种情况下只是出现至少3次的那些.
所以在这种情况下我只想返回"category_1"和"category_2".
我尝试了很多方法,但似乎没有任何工作,我不断收到以下错误:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean
given in [FILE NAME OMITTED] on line 101
Run Code Online (Sandbox Code Playgroud)
以下是我尝试过的一些事情:
$query = "SELECT DISTINCT blog_category
FROM blog_posts
HAVING COUNT (blog_category) >= 3";
$query = "SELECT DISTINCT blog_category
FROM blog_posts
WHERE blog_category IN
(SELECT blog_category
HAVING (COUNT (blog_category) >= 3))";
$query = "SELECT DISTINCT blog_category
FROM blog_posts
WHERE blog_category
HAVING COUNT(blog_category) >= 3";
$query = …Run Code Online (Sandbox Code Playgroud) 所以我理解并发现帖子表明,当您从 DBMS 检索数据时,不建议在 SQL 查询中省略 order by 子句。
参考的资源和帖子(将更新):
SQL Server UNION - 默认 ORDER BY 行为是什么
问题 :
如果您想了解更多信息,请参阅下面问题的逻辑。
我的问题是:在带有innoDB引擎的mysql下,有谁知道DBMS如何有效地给我们结果?
我读到它是依赖于实现的,好的,但是有没有办法知道我当前的实现?
这具体是在哪里定义的?
是来自MySQL、InnoDB、操作系统相关吗?
那里没有某种清单吗?
最重要的是,如果我省略 order by 子句并获得结果,我无法确定该代码是否仍适用于较新的数据库版本,并且 DBMS 永远不会给我相同的结果,可以吗?
用例和逻辑:
我目前正在编写一个 CRUD API,并且我的数据库中有一个不包含“id”字段的表(尽管有一个 PK),所以当我在没有任何研究标准的情况下显示该表的结果时,我真的不知道应该用什么来排序结果。我的意思是,我可以使用 PK 或任何从不为空的字段,但这不会使其相关。所以我想知道,因为我的 CRUD 应该适用于任何表,并且我不想通过为这个特定表添加例外来解决这个问题,所以我也可以简单地省略 order by 子句。
最后注意事项:
当我阅读其他帖子、示例和代码示例时,我感觉我想走得太远。据我了解,众所周知,在请求中省略 Order By 子句只是一种不好的做法,并且没有可靠的默认订单子句,并不是说除非您指定,否则根本没有订单。
我只是想知道它是在哪里定义的,并且很想了解它在内部是如何工作的,或者至少是在哪里定义的(DBMS /存储引擎/操作系统相关/其他/多个标准)。我认为了解它并了解这里的内部机制也对其他人有益。
不管怎样,感谢您花时间阅读!祝你今天过得愉快。
以我的理解,mysql binlog可以完全充当InnoDB的重做日志。
那么,启用Binlog后,为什么InnoDB必须同时编写重做日志,而不是仅仅切换为使用Binlog?这是否会大大降低数据库的写入性能?
除了简化设计和实现之外,这样做还有什么好处?
AFAIK,要在保证ACID符合性的同时启用两个日志,将发生以下问题:
因此,所有其他产品似乎仅使用一组日志(SQL Server称为事务日志,ORACLE称为重做日志,PostgreSQL称为WAL)来完成所有相关工作。难道只有MySQL必须同时打开两组日志以确保ACID合规性和强而一致的主从复制吗?
在仅启用其中一项的情况下,是否有一种方法可以实现ACID遵从性和强大的一致半同步复制?
据我所知,InnoDB中null可以建立索引。但许多同事表示空值是糟糕的数据库设计。所以我不知道“null”的问题是什么,是第三个值(eq,not eq,notknown)问题还是其他阻止人们使用可空列的问题?