mysql表的導入導出

⒈select ... into outfile導出數據/load data infile導入數據
⑴創建新表,定義表結構
  ⅰ方法一:在同一數據庫中
      ①複製表結構及數據到新表
      CREATE TABLE newtable  SELECT * FROM oldtable
      ② 只複製表結構到新表
       CREATE TABLE newtable  SELECT * FROM oldtable WHERE 1=2
  ⅱ方法二:適應庫與庫之間,或者單庫
      ①只複製表結構到新表
     導出:
     mysqldump -uroot -pdbpasswd -d dbname [tablename]>createtable.sql;
     導入:
      mysql>source /path/createtable.sql  or  mysql -u root -p <createtable.sql;
    mysql> source /usr/yzx_loadtest/createbus_dt.sql;
   Query OK, 0 rows affected (0.01 sec)
⑵導出/導入表數據
導出數
select * from mytbl into outfile '/tmp/mytbl2.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n';
select * from bus_dt into outfile '/usr/yzx_loadtest/bus_dtbackdata.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n';
導入數據
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'  [REPLACE | IGNORE]  INTO TABLE tbl_name  [FIELDS  [TERMINATED BY 'string']  [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char' ] ]     [LINES  [STARTING BY 'string']  [TERMINATED BY 'string'] ]
load data infile '/usr/yzx_loadtest/bus_dtbackdata.txt' into table bus_dt fields terminated by ',' enclosed by '"' lines terminated by '\n';
關於NULL值
null值被處理成\N

⑶大數據表如何節省導入/導出的時間


ⅰ對於Myisam類型的表,可以通過以下方式快速的導入大量的數據。 ALTER TABLE tblname DISABLE KEYS; loading the data ALTER TABLE tblname ENABLE KEYS; 這兩個命令用來打開    或者關閉Myisam表非唯一索引的更新。在導入大量的數據到一個非空的Myisam表時,通過設置這兩個命令,可以提高導入的效率。 對於導入大量數據到一個空的Myisam表,默認就是先    導入數據然後才創建索引的,所以不用進行設置。


ⅱ對於Innodb類型的表,有以下幾種方式可以提高導入的效率:
①因爲Innodb類型的表是按照主鍵的順序保存的,所以將導入的數據按照主鍵的順序排列,可以有效的提高導入數據的效率。如果Innodb表沒有主鍵,那麼系統會默認創建一個內部列作    爲主鍵,所以如果可以給表創建一個主鍵,將可以利用這個優勢提高導入數據的效率。
②在導入數據前執行SET UNIQUE_CHECKS=0,關閉唯一性校驗,在導入結束後執行SET UNIQUE_CHECKS=1,恢復唯一性校驗,可以提高導入的效率。
③如果應用使用自動提交的方式,建議在導入前執行SET AUTOCOMMIT=0,關閉自動提交,導入結束後再執行SET AUTOCOMMIT=1,打開自動提交,也可以提高導入的效率。


ⅲ對於表級上千萬或者上億,需要分文件進行導入;
爲什麼?load data file需要寫二進制日誌,另外如果是主從複製,還會有延遲,如果失敗,回退仍需要時間。
查看插入數據的行數:
[root@node1 yzx_loadtest]# wc -l bus_dtbackdata.txt
1021 bus_dtbackdata.txt
利用split進行分割:
[root@node1 yzx_loadtest]# split -l 500 bus_dtbackdata.txt bus_dtbackdata.txt001
[root@node1 yzx_loadtest]# ls -l
total 48
-rw-rw-rw- 1 mysql mysql 17247 Apr  9 11:45 bus_dtbackdata.txt
-rw-r--r-- 1 root  root   7907 Apr  9 13:40 bus_dtbackdata.txt001aa
-rw-r--r-- 1 root  root   8939 Apr  9 13:40 bus_dtbackdata.txt001ab
-rw-r--r-- 1 root  root    401 Apr  9 13:40 bus_dtbackdata.txt001ac
-rw-r--r-- 1 root  root   1640 Apr  9 11:50 createbus_dt.sql
[root@node1 yzx_loadtest]#

分割之後使用:
load data infile '/usr/yzx_loadtest/bus_dtbackdata.txt001aa' into table bus_dt fields terminated by ',' enclosed by '"' lines terminated by '\n';
load data infile '/usr/yzx_loadtest/bus_dtbackdata.txt001ab' into table bus_dt fields terminated by ',' enclosed by '"' lines terminated by '\n';

注意事項:必須保證導入的庫與導出的庫的字符集相同
 show variables like 'char%'
 set ...=gbk;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章