Questions tagged «mysql»

MySQL的所有版本(不是Microsoft SQL Server)。如果与此问题相关,还请添加特定于版本的标记,例如mysql-5.7。

2
innodb_flush_method = O_DIRECT与O_DSYNC性能对具有LVM磁盘分区的ext3的影响
在我的一个生产环境中,我们有两个实例在RedHat集群上运行,并且一个生产实例与该集群相关联。 我们有125G主内存,instance1占用了24G InnoDB缓冲池,instance2占用了12G,这与RedHat集群无关。数据日志和事务日志都位于带有ext3文件系统的LVM磁盘分区上。 为了提高性能和提高I / O吞吐量,我决定更改innodb_flush_method为O_DIRECT。 参考MySQL文档: InnoDB数据和日志文件位于SAN上的位置,已发现将设置innodb_flush_method为O_DIRECT可以使简单SELECT语句的性能降低三倍。 提到高性能MySQL Ver 2和3,它指出InnoDB开发人员使用发现了错误innodb_flush_method=O_DSYNC。O_SYNC并且O_DSYNC类似于fsync()和fdatasync():O_SYNC同步数据和元数据,而O_DSYNC仅同步数据。 如果所有这些看起来都像是在没有任何建议的情况下进行很多解释,则以下是建议: 如果您使用类似Unix的操作系统,并且您的RAID控制器具有备用电池的写缓存,则建议您使用O_DIRECT。如果不是,则默认设置或O_DIRECT将是最佳选择,具体取决于您的应用程序。 谷歌搜索,我得到这个基准测试报告:在O_DSYNCVSO_DIRECT 基准报告: =================== 1B行复杂事务测试,64个线程 * SAN O_DIRECT:读/写请求:31560140(每秒8766.61个) * SAN O_DSYNC:读/写请求:5179457(每秒1438.52) * SAN fdatasync:读/写请求:9445774(每秒2623.66) *本地磁盘O_DIRECT:读/写请求:3258595(每秒905.06) *本地磁盘O_DSYNC:读/写请求:3494632(每秒970.65) *本地磁盘fdatasync:读/写请求:4223757(每秒1173.04。 但是,O_DIRECT禁用OS级别的缓存,可以禁用双重缓存,这会显示出更好的I / O吞吐量。 O_DIRECT而不是一起去O_DSYNC好吗?这两个选项有些令人困惑。哪个选项可以显示出更好的I / O吞吐量并增强性能,而不会对数据,读/写(特别是在生产中)产生任何影响?根据您的个人经验有更好的建议吗? 我可以在帖子中看到Rolando Update : 这两个参数仍然有些混乱。在可以看到大多数使用的生产配置模板的地方O_DIRECT,没有任何推荐的地方O_DSYNC。 系统 MySQL 5.1.51-enterprise-gpl-pro-log 红帽企业Linux服务器5.5版 具有Raid Controller的DELL DRAC,具有电池写回缓存512MB Dell PERC控制器H700带有备用电池(BBU)。 附加信息 mysql>显示类似'innodb_thread_concurrency'的变量; …

1
为什么DELETE比SELECT慢得多,然后按ID进行DELETE?
我有一个非常繁忙的InnoDB表(200,000行,我猜每秒大概有几十个查询)。由于一个错误,我得到了14行,其中包含(相同)无效的电子邮件地址,并希望将其删除。 我只是尝试DELETE FROM table WHERE email='invalid address'了一下,并在大约50秒后得到了“超出了锁定等待超时”。这并不奇怪,因为未对行列进行索引。 但是,然后我做了SELECT id FROM table WHERE email='invalid address',那花了1.25秒。运行DELETE FROM table WHERE id in (...),从SELECT结果中复制粘贴ID,花费了0.02秒。 到底是怎么回事?有人可以解释为什么带有条件的DELETE这么慢以至于超时,但是执行SELECT然后按ID删除却是如此之快吗? 谢谢。 编辑:根据要求,我发布了表结构以及一些explain结果。我还应注意,没有任何外键引用此表。 但是,这种情况对我来说似乎很简单:我有一个未索引的字段可供选择。这需要扫描整个表,但是它并不大。id是主键,因此按ID删除应该是非常快速的。 mysql> show create table ThreadNotification2 \G *************************** 1. row *************************** Table: ThreadNotification2 Create Table: CREATE TABLE `ThreadNotification2` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `alertId` bigint(20) DEFAULT …

1
在JDBC中禁用显式提交,在SQL中检测它们,或将数据库置于只读状态
背景:我正在http://sqlfiddle.com(我的网站)上工作,并试图防止可能的一种滥用途径。我希望通过询问我当前要解决的问题,我不会无意间使潜在的虐待更为严重,但是您能做什么?我相信你们。 我想防止任何用户在给定的交易块内发出明确的“提交”调用。从SQL Fiddle的上下文来看,事务块是在右侧面板上执行的代码。基本上,我遍历并执行一系列明文SQL命令,并且我想确保它们所做的所有更改都将在批处理结束时回滚。通常,它们的更改会回滚,但是有时文本中会包含明确的“ commit”语句,因此我的回滚当然是行不通的。用户试图破坏SQL Fiddle上的架构时,很可能发生这种显式提交,因此其他从事此操作的人将看到错误。 主要期望结果:如果可能,我想在JDBC级别禁用显式提交。这是因为我必须支持多个数据库后端供应商,并且当然每个供应商都有其低级的怪癖。 Fallback选项:如果无法将JDBC配置为禁用显式提交,那么我将接受在处理以下每个后端批处理时检测显式提交的解决方案:SQL Server,Oracle,MySQL和PostgreSQL。 对于SQL Server,我想到了这种解决方案:在执行该语句之前,先解析XML查询计划中的语句,然后检查是否存在与该XPath相匹配的条目: //*[@StatementType="COMMIT TRANSACTION"] 我认为这对于SQL Server来说会很好。但是,这种方法不适用于其他数据库类型。Oracle针对显式提交的XML执行计划输出未引用您正在运行commit语句的事实(而只是重复从其提交的查询中重复执行计划输出)。PostgreSQL和MySQL根本不为显式提交提供任何执行计划输出(XML或其他方式)。 剩下的工作就是检查“ commit”一词的实际陈述。这将起作用,除非可能存在各种变化: declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上面是SQL Server的示例(我可以解决),但是我想Oracle,MySQL和PostgreSQL可能会发生类似的事情。我在这个假设上错了吗?也许他们不允许“动态”提交语句?随意使用SQL Fiddle(最好不要使用示例架构或可能正在使用的其他示例)来查看是否可以在Oracle,MySQL和PostgreSQL中进行类似的操作。如果没有,也许简单的字符串检测可能适用于那些。 还有另一种可能性 我想到了另一个选择-如果您知道一种将这些数据库中的任何一个设置为只读模式的方法,例如在该模式下,什么也不能提交,那也可以工作。只要在该模式下什么也不能提交,我就仍然需要允许启动事务并在其中运行代码。那可能吗? 更新资料 我最近学到的-PostgreSQL实际上不是问题。显然,如果同一交易块最终被回滚(在Postgres中),则该交易块中发出的提交将不适用。所以为Postgres致敬! 多亏了Phil在SO帖子上的链接,我想我可以使用DEFERRABLE INITIALIALLY DEFERRED hack for Oracle来完成我要执行的操作(如果发出了提交,将会引发错误,但是我可以解决这个问题)。这应该针对Oracle。(我想了一会儿嵌套事务可能在这里工作,但是Oracle似乎不支持嵌套事务?无论如何,我找不到以这种方式工作的任何东西)。 真的还没有针对MySQL的解决方案。使用嵌套事务进行了尝试,但这似乎不起作用。我正在认真考虑MySQL的更严格的方法,例如不允许在右侧使用SELECT或在每次查询后删除/重新创建数据库。听起来都不好。 解析度 因此,我现在已经为SQL Server和Oracle实现了所描述的解决方案,并且正如我提到的那样,对于PostgreSQL来说这实际上不是问题。对于MySQL,我采取了一些不幸的步骤,将查询面板限制为仅选择语句。仅需在架构面板(左侧)上输入用于MySQL的DDL和DML。我希望这不会破坏太多的旧提琴,但是我认为这只是确保数据一致性所要做的。谢谢!

2
位与布尔列
假定位字段只是数据的二进制表示形式,则需要以稍微“奇怪”的方式进行查询。 使用位字段作为布尔值实际上有什么好处吗?从我看来,这似乎表明空间是唯一的真正好处。

2
PHP-> Mysql持久连接池,没有mysql_pconnect-可能吗?
一段时间以来,我一直在试图找到一种不错的方法。但是很难找到合适的方法来做到这一点。我猜这一定有可能。 简单来说,这就是我要完成的工作: PHP / Other front end -> [SOCKET] -> Locally hosted 'pooler' -> [Pool of persistent TCP/IP connection(s)]-> Externally hosted MySQLD 是否存在这种工具/做事方式? 我们基本上想在不使用mysql_pconnect的情况下实现持久的mysql连接。 我诚恳地要求我们不要开始讨论如何不需要持久性连接等等。我们已经用完TIME_WAIT端口,并且遇到其他问题,如果实施这种类型的系统,则可以解决。 是的,总结一下……我们将实现一个基于本地端的Socket的mysql连接池,并持久化与(LAN)外部托管的mysql服务器的连接。 我们不使用事务或任何其他将受到回收的mysql连接影响的事务。 我们在前端使用master + master percona 5.5集群运行linux。 谢谢!
12 mysql 

4
无NULL,但编码“ UTF8”的字节序列无效:0x00
我花了最后8个小时尝试将mysqldump --compatible = postgresql的输出导入到PostgreSQL 8.4.9中,并且在这里和其他地方已经阅读了至少20个不同的线程,但是都没有找到关于此特定问题的信息。实际可行的答案。 MySQL 5.1.52数据转储: mysqldump -u root -p --compatible=postgresql --no-create-info --no-create-db --default-character-set=utf8 --skip-lock-tables rt3 > foo PostgreSQL 8.4.9服务器作为目标 使用'psql -U rt_user -f foo'加载数据正在报告(其中很多,这是一个示例): psql:foo:29: ERROR: invalid byte sequence for encoding "UTF8": 0x00 HINT: This error can also happen if the byte sequence does not match the encoding …

2
MySQL中基于行的复制和基于语句的复制之间的区别?
基于行的复制和基于语句的复制之间的实际区别是什么?我实际上是在查看复制对从属服务器的影响。 如果我使用的是基于行的复制,那么对从属服务器有什么影响?如果我使用的是基于语句的复制,那么会有什么影响? 请同时考虑以下参数: replicate-ignore-db and replicate-do-db 谢谢....!

1
MySQL Workbench数据库大小
我正在尝试查找所有MySQL Workbench数据库正在使用的硬盘上的总大小。 有谁知道解决这个问题的简便方法? 如果没有其他要求,mysql / workbench的默认位置用于将原始数据保存在Windows计算机上吗? 提前致谢!昆蒂斯

2
如何在MySQL上配置全局字符集
我试图通过my.cnf更改MySQL的字符集,但失败了。我添加了下面列出的字符集设置: # The MySQL server [mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock skip-locking key_buffer = 16M max_allowed_packet = 1M table_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M # ------------- MYSQL CHARSETS -------------- character_set_system = utf8 character_set_server = utf8 character_set_results = …
12 mysql  my.cnf 

5
导入大型SQL文件phpmyadmin
我试图在phpmyadmin中导入此SQL文件并收到此消息 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '<br /> <b>Fatal error</b>: Allowed memory size of 134217728 bytes exhausted (tr' at line 1 我该怎么做才能导入?
12 php  mysql  phpmyadmin 

2
主机“ host_name”在MySQL中被阻止的原因是什么?
当我使用不正确的密码连接到mysql服务器,并且测试计数超过时max_connect_errors,我发现Aborted_connects也出现了我测试的计数,但是主机仍未被阻止。 那么Aborted_connectsover the max_connect_errorshost_name是否被阻止?
12 mysql 

2
如果按顺序执行,这两个查询会导致死锁吗?
几乎可以肯定这是我提出另一个问题的原因,但是我认为有必要将两者分开,因为我有一个假设,该假设基于以下日志,我希望对其进行伪造或验证。 我的假设是,另一个死锁实际上是以下查询的结果,根据我的理解,隐藏原始查询的原因是innodb状态仅显示最近的事务(这对吗?)。 根据日志,我检查了我们的代码,发现依次执行了以下两个查询: db.Execute("UPDATE people SET iphone_device_id=NULL WHERE iphone_device_id=@0 AND people_id<>@1", DeviceID, m_User.people_id); // I have hard coded this query in this snippet to simplify things db.Execute("UPDATE people SET company_id = 444, name = 'Dad', password = '<pass>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@gmail.com', phone = NULL, …

4
在Windows中安装默认的MySQL表(mysql_install_db)
在Linux中,可以使用该mysql_install_db脚本创建默认的MySQL授权表,但这在Windows上不起作用。 如何在Windows上安装默认授权表? (不,我不是在寻找关于Google的结果如何在Windows上自动安装的包装,因为这只是安装程序发行版的情况,而不是ZIP包。此外,这在以后没有帮助MySQL已安装且数据目录已损坏或正在被替换等。)

3
MySQL数据类型为128位整数
我需要将128位无符号整数存储到MySQL中,我想知道什么是存储如此大数字的最佳数据类型。 现在,我正在使用,binary(16)但这涉及很多转换功能pack(/huge number in hex .../)。 有没有最好的数据类型来存储128位无符号整数?
12 mysql  datatypes 

5
有没有MySQL基准测试工具?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我很久以前就听说过,有这个工具可以帮助您tweek mysql设置以获得更好的性能,但是我无法找到它。我知道我可以使用ab for apache来模拟高流量,这会生成缓慢的日志。但是,如果崩溃(已经发生并且处于生产模式),我不知道为什么崩溃以及是否可以从配置中删除它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.