AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 29432
Accepted
Dimitre Radoulov
Dimitre Radoulov
Asked: 2012-11-29 07:07:20 +0800 CST2012-11-29 07:07:20 +0800 CST 2012-11-29 07:07:20 +0800 CST

mysqld 在打开实例之前是否等待初始化脚本代码完成?

  • 772

我正在尝试在MySQL启动时自动执行应用程序代码。init-file服务器选项似乎很方便,我需要知道 mysqld在使实例和数据库可用之前是否等待init-file中的所有代码完成。

我试图建立一个快速测试用例,它似乎不像我预期的那样工作:

创建一个简单的测试表和一个只插入记录的过程

create table init_test_tab (x char);
delimiter $$
drop procedure init_test $$
create procedure init_test(p char(1))
begin
  do sleep(300);
  insert into init_test_tab VALUES(p);
END
$$

从初始化文件调用该过程:

$ cat /var/lib/mysql/mysql-init.sql
call xxxx.init_test('y');
$ grep init /etc/mysql/my.cnf
init-file = /var/lib/mysql/mysql-init.sql

重新启动服务器以验证时序并检查测试表的内容:

会话 1 - 表为空:

[Wed Nov 28 15:54:26 2012]> select * from init_test_tab;
Empty set (0.00 sec)

会话 2 - 重新启动 mysqld:

# time service mysql restart
mysql stop/waiting
mysql start/running, process 3031

real    0m10.116s
user    0m0.024s
sys     0m0.068s

请注意,重新启动只需 10 秒。

会话 1 - 连接丢失(如预期):

[Wed Nov 28 15:54:33 2012]> select * from init_test_tab;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ERROR:
Can't connect to the server

[Wed Nov 28 15:54:45 2012]> select * from init_test_tab;
No connection. Trying to reconnect...
Connection id:    2
Current database: xxxxx

+------+
| x    |
+------+
| y    |
+------+
1 row in set (0.01 sec)

[Wed Nov 28 15:54:50 2012]>

请注意,该过程会自动调用(如预期的那样),因为表不再为空。但是插入应该只在 sleep(300) 调用之后执行,而不是立即执行(或者,准确地说,只是在几秒钟内)。

所以现在我试图理解:

  1. 如果我在 init 文件中放置一个过程调用(或任何应用程序代码),它是否会按预期执行(在我的测试用例中,睡眠调用似乎被跳过了)?
  2. 我可以对执行的内容进行某种记录(除了修改代码本身)吗?
  3. 如果init-file中的代码需要时间,是否会影响MySQL实例在重启后的可用性?

谢谢迪米特

mysql mysql-5.5
  • 1 1 个回答
  • 2175 Views

1 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-11-29T08:13:18+08:002012-11-29T08:13:18+08:00

    试图理解#1

    如果我在 init 文件中放置一个过程调用(或任何应用程序代码),它是否会按预期执行(在我的测试用例中,睡眠调用似乎被跳过了)?

    是的,它会的。过去,我建议使用init-file为 MyISAM 表创建专用的密钥缓存:

    • Aug 28, 2012:交换中的 MySQL InnoDB 索引(参见建议 #3)
    • Mar 20, 2012:具有主键和 varchar 值的最优表设计 mysql

    我目前正在为我雇主公司的客户做这件事。

    试图理解#2

    我可以对执行的内容进行某种记录(除了修改代码本身)吗?

    抱歉不行。您将拥有以下之一:

    1. 将更改写入某些 MyISAM 表以标记阶段
    2. 运行类似SELECT 'DEBUG#1;'...SELECT 'DEBUG#2;'以查看它是否回显到错误文件。将这些 SELECT 查询放在代码中的不同位置。

    试图理解#3

    如果初始化文件中的代码需要时间,可以吗?重启后立即影响 MySQL 实例的可用性

    仅从您在问题中发布的示例来看,他们的回答仍然是否定的。但是,为了确定,您必须让 mysqld 告诉您这一点。假设/var/log/mysqld.log是你的错误日志,这里是如何检查:

    • 打开到 DB 服务器的 SSH 会话(Session1)
    • 打开到 DB 服务器的 SSH 会话(Session2)
    • 在会话 1 中,service mysql stop
    • 在会话 1 中,tail -f /var/log/mysqld.log
    • 在会话 2 中,service mysql start

    观察 Session1 的输出。如果你看到类似的东西

    121018 17:59:09 [Note] /usr/sbin/mysqld: ready for connections.
    

    在不到 5 分钟(300 秒)内,这将确认答案是否定的,重启后 MySQL 实例的可用性不受影响。

    为什么 SLEEP() 不起作用???

    至于为什么SLEEP似乎跳过了该功能,这是我最好的猜测:

    早在 MySQL 5.0.12 中,SLEEP 通过一些优化被插入到查询缓存中。存储过程的内部代码可能正在优化,mysqld 决定不让SLEEP干扰 EXPLAIN 计划的形成及其执行。

    回到 MySQL 5.0 时应用了它的补丁。从 MySQL 5.0 升级到 MySQL 5.1 及更高版本时是否会丢失该补丁?这是一种可能性。另一种可能性是,SLEEP尽管有补丁,它还是被优化掉了。

    有些用于SLEEP嵌入互斥、执行压力测试或花哨的作业调度

    • https://stackoverflow.com/q/4284524/491757
    • https://stackoverflow.com/q/949950/491757
    • http://forums.mysql.com/read.php?98,242758,242792#msg-242792
    • http://rpbouman.blogspot.com/2005/10/scheduling-procedure-execution-in.html

    使用SLEEP并不总是按预期执行。

    更新 2012-11-27 15:50 EDT

    如果您真的想控制该SLEEP功能,请不要使用该功能!

    创建一个检查时间流逝的循环

    而不是你的代码

    delimiter $$
    drop procedure init_test $$
    create procedure init_test(p char(1))
    begin
      do sleep(300);
      insert into init_test_tab VALUES(p);
    END
    $$
    

    像这样嵌入循环:

    delimiter $$
    drop procedure init_test $$
    create procedure init_test(p char(1))
    begin
      declare dt_now,dt_then datetime;
      declare x int;
    
      set dt_now = now();
      set dt_then = dt_now + interval 300 second;
      while dt_now < dt_then do
        set dt_now = now();
      end while;
    
      insert into init_test_tab VALUES(p);
    END
    $$
    

    请查看该构造是否适合您。

    • 3

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve