我的从数据库上有个存储过程,里面有
 CREATE TEMPORARY TABLE IF NOT EXISTS AAA(...)
 ...
 TRUNCATE TABLE AAA
查看主库的binlog可以看到里面将存储过程解析为了多条sql,其中就有TRUNCATE TABLE AAA,在从库中执行的时候,有时候会出现
Slave SQL: Error 'Table 'db.AAA' doesn't exist' on query. Default database: 'db'. Query: 'TRUNCATE TABLE AAA', Error_code: 1146

解决方案 »

  1.   

    SLAVE在解析日志后,执行SQL语句,可能不是同一个会话。
    我的意思是说CREATE TEMPORARY TABLE 是一个会话,执行完后关闭了。然后执行TRUNCATE TABLE AAA的时候新起一个会话,这时候就找不到表了。
      

  2.   

    在mysql中没有表变量这一概念!
    mysql有临时表:create temporary table if not exists {表定义}  --关键字”temporary“指示mysql创建会话级别的临时表。临时表只对当前会话可见,连接断开时,自动删除! 
    你不必担心所创建的临时表的名称会和其他会话建立的临时表、或非临时表冲突!注意如果你的临时表和正常表名称相同,正常表会被隐藏——如同全局变量和局部变量那样 
    创建临时表不会引发通常的commit事务提交 
     使用临时表的诸多限制引擎类型只能是:memory(heap)、myisam、merge、innodb 
    不支持mysql cluster 
    同一个查询语句中只能引用一次! 如 SELECT * FROM TP_TABLE , TP_TABLE AS ALIAS_NAME;  是错误的 同一个用户存储函数中只能引用一次! 
    show tables 不会显示临时表 
    不能使用rename重命名临时表。只能使用ALTER TABLE OLD_TP_TABLE_NAME RENAME NEW_TP_TABLE_NAME; 
    影响使用replication功能 
     mysql服务器自动使用的内部临时表在某些情况下,mysql服务器会自动创建内部临时表:该临时表可以是只存在于内存的memory临时表,或者是存储于硬盘的myisam临时表;而且 初始创建的memory临时表由于表的增大 可能会转变为myisam临时表——其转化临界点由max_heap_table_size 和tmp_table_size系统变量的 较小值 决定的!注意:max_heap_table_size系统变量应用于所有的memory引擎的表,不管是用户临时表、正常表、或者内部临时表。