中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

再說說LOAD和SOURCE

發布時間:2020-06-17 04:15:08 來源:網絡 閱讀:1173 作者:coveringindex 欄目:MySQL數據庫

MySQL中導入數據的方法主要有兩種: LOADSOURCE, 下面看看兩者的特點.

 

測試過程中二進制日志格式, 和用到的表結構如下:

(root@localhost) [(none)]> SHOW VARIABLES LIKE 'binlog_format';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| binlog_format | ROW  |

+---------------+-------+

1 row in set (0.00 sec)

 

(root@localhost) [stage]> SHOW CREATE TABLE st1\G

*************************** 1. row***************************

      Table: st1

Create Table: CREATE TABLE `st1` (

  `a`int(10) unsigned NOT NULL DEFAULT '0',

  `b`varchar(4) NOT NULL DEFAULT '',

  `c`int(11) NOT NULL DEFAULT '0'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

1 row in set (0.00 sec)

 

使用LOAD導入數據.

(root@localhost) [stage]> LOAD DATA INFILE '/tmp/st1.txt' INTO TABLE st1;

Query OK, 4 rows affected (0.00 sec)

Records: 4 Deleted: 0  Skipped: 0  Warnings: 0

 

分析其產生的二進制日志, 可以發現LOAD將該過程作為一個事物了.

BEGIN

/*!*/;

# at 193

# at 263

#170904 15:36:07 server id 1683316  end_log_pos 314 CRC32 0xffbd6789       Table_map: `stage`.`st1` mapped to number76

# at 314

#170904 15:36:07 server id 1683316  end_log_pos 397 CRC32 0xb3c288aa     Write_rows: table id 76 flags: STMT_END_F

### INSERT INTO `stage`.`st1`

### SET

###  @1=1

###  @2='aa'

###  @3=2

### INSERT INTO `stage`.`st1`

### SET

###  @1=2

###  @2='bb'

###  @3=4

### INSERT INTO `stage`.`st1`

### SET

###  @1=3

###  @2='cc'

###  @3=6

### INSERT INTO `stage`.`st1`

### SET

###  @1=4

###  @2='dd'

###  @3=8

# at 397

#170904 15:36:07 server id 1683316  end_log_pos 428 CRC32 0x67fed44c      Xid = 29

COMMIT/*!*/;

 

上面的過程, 其實和下面的語句是等價的.

START TRANSACTION;

INSERT INTO st1 VALUES(…);

INSERT INTO st1 VALUES(…);

COMMIT;

 

LOAD遇到錯誤, 如數據類型不對, 或數據列不匹配等, 整個過程就會回滾. 下面是實際數據導入中遇到的一個報錯:

(root@localhost) [product]> LOAD DATA INFILE '/tmp/pro1.txt' INTO TABLE pro1;

ERROR 1261 (01000): Row 4999999 doesn'tcontain data for all columns

 

(root@localhost) [product]>system perror 1261;

MySQL error code 1261(ER_WARN_TOO_FEW_RECORDS): Row %ld doesn't contain data for all columns

 

如上報錯, 在導入第499999條記錄時, 遇到錯誤, 整個事物進行了回滾, 這樣的大事物運行效率很低, 即使最后提交成功, 在主從復制環境下, 也極有可能造成延時.

 

建議LOAD導入數據時, 可先用命令split將數據文件分成若干小文件, 然后多次導入; 也可借助PT工具pt-fifo-split分割文件, 其具體使用見說明文檔.

 

 

其實上面拆分導入的方式, 正是命令SOURCE的思路, 其一般導入INSERT語句, 格式如INSERT INTO st1 VALUES(…), (…), (…) …

 

下面是實際數據導入中摘出來的日志:

Query OK, 8690 rows affected (0.19 sec)

Records: 8690  Duplicates: 0 Warnings: 0

 

Query OK, 8800 rows affected (0.24 sec)

Records: 8800  Duplicates: 0 Warnings: 0

 

可見SOURCE8000行記錄左右提交一次, 也可在二進制日志中得到印證. 若某條記錄出錯, 其所在分組會進行回滾. 至于為什么是8000, 暫且理解為內部機制了.


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广西| 台山市| 施秉县| 台东市| 昌都县| 兴义市| 湛江市| 沂南县| 马公市| 仁化县| 稷山县| 阆中市| 呼玛县| 三原县| 绥棱县| 甘谷县| 襄汾县| 牟定县| 曲阳县| 招远市| 仙游县| 当雄县| 哈巴河县| 固阳县| 樟树市| 深圳市| 忻城县| 白山市| 宁蒗| 大埔区| 莱西市| 陵川县| 西乌珠穆沁旗| 碌曲县| 乌鲁木齐市| 吐鲁番市| 屏东市| 铜川市| 宜春市| 剑河县| 宜昌市|