MySQL百万データ導入の実践

3879 ワード

日常開発の過程で、データベースの移転、分庫などの操作に遭遇し、データが少ない場合はnavicateを借りて操作することができ、大量のデータにとって、ツールが不器用になり、百万級のデータの導入に一日中かかる可能性があります.これは受け入れられません.
mysqlは、ビッグデータのインポートに特化したコマンドを提供します.
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name,...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var,...)]
[SET col_name = expr,...]

しかし、このコマンドを使用するには、穴を踏まなければなりません.
1、安全配置.mysqlのデフォルトではファイルのインポートとエクスポートは許可されていません.次のコマンドでsecure_が表示されます.file_priv=null.
mysql> show variables like '%secure%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| require_secure_transport | OFF   |
| secure_auth              | ON    |
| secure_file_priv         | NULL  |
+--------------------------+-------+
3 rows in set, 1 warning (0.00 sec)

2、配置はドアがない.mysqlインストールディレクトリの下に配置できる場所がないので、myが見つからない.ini.
mysqlインストールディレクトリのルートディレクトリの下でmyを手動で作成する必要があります.ini(本人テストマシンはwindows、パスは:
C:\Program Files\MySQL\MySQL Server 5.7):
[mysqld]
secure_file_priv=
character-set-server=utf8
#  IPv4 3306  
bind-address = 0.0.0.0
port = 3306
#sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
default_storage_engine=innodb
innodb_buffer_pool_size=1000M
innodb_log_file_size=50M
#        
max_connections=200
# skip_grant_tables
[mysql]
default-character-set=utf8
[mysql.server]
default-character-set=utf8
[mysql_safe]
default-character-set=utf8
[client]
port = 3306

3、mysqlを再起動して構成を有効にする.
net stop mysql  #  mysql
net start mysql  #  mysql

4、再検証、secure_を見ることができるfile_priv=nullは、ファイルのインポートとエクスポートが可能であることを示します.
mysql>  show variables like '%secure%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| require_secure_transport | OFF   |
| secure_auth              | ON    |
| secure_file_priv         |       |
+--------------------------+-------+
3 rows in set, 1 warning (0.00 sec)

5、再度実行して、引き続きエラーを報告して、ファイルが見つからないで、ヒントによって、ファイルは指定のディレクトリの下に置く必要がある(データベース名は:learn):
C:\Program Files\MySQL\MySQL Server 5.7\data\learn\test_db.sql

6、再実行して、引き続きエラーを報告する:
Incorrect integer value: '' for column 'id' at row 1

カラムIDはintegerですが、データは‘1’:
INSERT INTO `system_user` VALUES ('1', '39352f81-165e-4405-9715-75fcdf7f7068', '   ', 'bANyhSmVtgxYmOcF', '15175232269', '   ,   ', '0', '2', '2015-01-01 00:00:00');

一般的に私たちは間違いないと思います.後でMYSQLの資料を調べてみました.5.5以上のバージョンの検証が厳しいことがわかりました.
7、修正my.ini:
デフォルトは
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",
に変更
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"mysqlを再起動すればよい
8、再試行、330万データ、導入に50.20秒しかかからず、効率が非常に高い
mysql> LOAD DATA INFILE "test_db.sql" INTO TABLE system_user FIELDS TERMINATED BY ',';
Query OK, 3323001 rows affected, 65535 warnings (50.20 sec)
Records: 3323001  Deleted: 0  Skipped: 0  Warnings: 16615005

参照ドキュメント:
https://www.cnblogs.com/lv_yantao/archive/2011/11/13/2246950.html
https://www.2cto.com/database/201803/725288.html
https://www.jb51.net/article/125905.htm
https://www.cnblogs.com/waynechou/p/7794939.html
https://segmentfault.com/a/1190000009333563