自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL:mysqldump 100M的數(shù)據(jù)導(dǎo)入需要幾個小時?

數(shù)據(jù)庫 MySQL
第一次遇到這種問題,僅此記錄。問題主要是一個mysqldump導(dǎo)出也就100來M的文件,導(dǎo)入居然要幾個小時,更換多個實例后都很慢。

這個問題相對簡單,但是第一次遇到這種問題,僅此記錄。問題主要是一個mysqldump導(dǎo)出也就100來M的文件,導(dǎo)入居然要幾個小時,更換多個實例后都很慢,文件大小如下:

當然這種可以重現(xiàn)的問題就再次導(dǎo)入看看為什么就可以了。

一、問題重現(xiàn)和分析

導(dǎo)入期間的信息如下:

OS狀態(tài)如下:

可以看到導(dǎo)入session的線程的CPU非常高。

查看show processlist狀態(tài):

查看CPU調(diào)用火焰圖:

耗用CPU最多的上層調(diào)用為mysql_alter_db。問題很明顯了,就是dump文件里面有大量的alter database 語句。這種語句耗用了大量的CPU,導(dǎo)致導(dǎo)入時間很長。

隨后查看文件中的alter database語句大概有5600個,每個就算1秒,也要5000多秒了,因此整個導(dǎo)入自然就慢了。

二、為什么有這么多的ALTER DATABASE語句

實際上在進行mysqldump的時候,如果發(fā)現(xiàn)存儲過程、自定義函數(shù)、觸發(fā)器等的字符集和庫的字符集不一致的時候就會調(diào)用switch_db_collation和restore_db_collation 函數(shù),將庫的字符集切換后再建立存儲過程等對象,然后再將庫的字符集切換回去,實際上就是多了如下的輸出,

if (strcmp(current_db_cl_name, required_db_cl_name) != 0)
{...
    fprintf(sql_file, "ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
            quoted_db_name, db_cl->csname, db_cl->m_coll_name, delimiter);
...
}

這樣這些對象的字符集就是導(dǎo)出庫一致的。

庫的字符集很明顯,而存儲過程、自定義函數(shù)、觸發(fā)器等獲取的是 Database Collation:

mysql> show create procedure get_order_total_amount2 \G
*************************** 1. row ***************************
           Procedure: get_order_total_amount2
...
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci ---這里

比如:

  • 當前庫:utf8mb3
  • 存儲過程是:utf8mb4_0900_ai_ci

那么導(dǎo)出的語句就是:

alter database charset utf8mb4 ...;
create procedure...
alter database charset utf8mb3...;

下面是測試的片段:

ALTER DATABASE `chr` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_order_total_amount2`(IN order_id INT, OUT total_amount DECIMAL(10, 2))
BEGIN
  SELECT SUM(total_amount) INTO total_amount FROM orders WHERE order_id = order_id;
END ;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;
ALTER DATABASE `chr` CHARACTER SET utf8mb3 COLLATE utf8_general_ci ;

可以看到在存儲過程建立的前后有alter database 語句。如果有幾千個這樣的存儲過程,雖然數(shù)據(jù)不大,但是導(dǎo)入?yún)s很很慢,因為耗用了太多CPU在alter database上,這些CPU耗用和導(dǎo)入的數(shù)據(jù)無關(guān)。

三、總結(jié)

這種問題出現(xiàn),最可能的原因就是當庫初始化完成后,某天用 alter database修改了庫的字符集,導(dǎo)致導(dǎo)出的時候比對存儲過程、自定義函數(shù)、觸發(fā)器等的字符集和庫的字符集不一致出現(xiàn)了alter database語句,如果剛好存儲過程、自定義函數(shù)、觸發(fā)器等很多那么就可能很慢很慢。

責任編輯:趙寧寧 來源: MySQL學習
相關(guān)推薦

2013-12-06 11:14:52

寬帶標準100M

2011-03-03 10:29:07

帶寬100M

2017-01-15 17:49:41

寬帶100M光纜

2011-03-25 12:51:33

Cacti流量

2019-08-25 23:30:10

mysql命令mysqldump

2013-12-06 17:01:53

100M光纖速度

2012-07-26 09:39:26

2017-10-31 11:27:14

寬帶百兆光纖移動

2014-05-27 14:21:42

2010-05-11 11:16:14

互聯(lián)網(wǎng)

2012-04-18 13:44:37

WPSWPS Office手內(nèi)存優(yōu)化

2011-03-30 11:04:11

mrtg

2010-05-13 11:02:25

PON

2012-04-17 09:24:10

工信部

2010-03-29 11:26:25

電信光纖到戶

2025-01-22 11:16:12

2012-05-07 14:22:48

寬帶

2015-12-03 09:02:22

掌握新事物100小時

2011-03-25 12:57:16

LinuxCacti安裝

2018-08-23 18:25:00

京東智能音箱
點贊
收藏

51CTO技術(shù)棧公眾號