記錄SQL Server向MySQL數據庫導入數據過程(SQL Server服務器拒絕連接解決方式、MySQL大數據批量導入)

我司現在全面切換MySQL,因此,原來部分的SQLserver的數據要導入到MySQL中。

導數據工具用的是Navicat的導入嚮導。

1.右擊表選擇 導入嚮導

2.選擇ODBC,進入,選擇SQL Server

3.輸入SQL Server服務器IP 地址,輸入用戶名、密碼,勾選 允許保存密碼、輸入要導入的庫名字

4.測試連接。連接成功,選擇要導入的表即可完成導入。

基本問題都出現在第三步,如果測試連接的時候提示SQL Server拒絕訪問或者不存在。可以用如下措施排查

1.檢查SQLserver服務器防火牆是否開啓,如果開啓了,可以暫時關閉,導完數據之後在開啓

2.如果防火牆已經關閉,檢查SQLserver服務器是否開啓了TCP/IP連接,這個選項默認是關閉的。打開SQLserver的配置工具,找到網絡配置,點擊啓用即可。

3.上述兩步之後還是不行,需要看一下,SQLserver登錄時什麼模式,是window驗證模式還是SQLserver驗證方式。

4.開啓SQLserver 驗證方式,具體方法是,在SQLserver managent studio中,右擊服務器,屬性,安全項中點選“SQL Server和Windows身份驗證模式”,點擊確定。

5.還是在屬性中,找到常規項,設置用戶名、密碼,可以設置簡單點,並且把強制密碼策略不勾選。

6.重啓SQLsever服務器。

這時候再連接基本可以了。

部分高級Navicat版本,如Mac版的Navicat12的ODBC中沒有SQLserver選項,只有用戶名、密碼,可以在Navicat上新建一個SQLserver的連接,然後使用另一種方式----數據傳輸也可以完成

完成了數據庫中的表結構和表數據的遷移,還有部分工作未完成。有幾個json文件的數據還沒有表接收,於是新建了表,打算使用Navicat的導入嚮導導入。總是不成功,也沒有去找原因,時間比較緊,於是使用官方的MySQL work bench 工具導入

接送數據如下:

json數據

如下圖

一步步操作即可,導入後發現created和updated都是空的,由於字段類型都是datetime,並不是時間戳,所以沒有辦法在插入時設置爲當前時間戳,於是寫一個觸發器,在插入之前,設置這兩個字段即可。

CREATE TRIGGER 觸發器名字 BEFORE INSERT ON area_province_gb FOR EACH ROW
BEGIN
SET new.created = NOW();
SET new.updated = NOW();
END;

重新導入一次,數據全部正常了。

於是想在深入點,瞭解一下MySQL的導入和導出

導出:官方有select * from tablename into outfile '/導出文件地址'  fields terminated by ",";例如

select * from city into outfile '/usr/local/mysql8/city.txt' fields terminated by ",";

將city的表導入到city.txt中,字段之間用 逗號分隔,默認使用製表符分隔。

導出時要注意,如果提示這種錯誤

--secure-file-priv option so it cannot execute

首先執行:

SHOW VARIABLES LIKE '%secure%'

查看secure_file_priv是不是NULL,如果不是,你的導出路徑要設置爲查出來的值,如果是NULL,你可以在my.cnf中mysqld下配置你想要存儲的路徑即可,這個路徑一定要是mysql用戶組也要具備的權限(切記切記切記),否則依舊會提示錯誤

errno 13 - Permission denied

你也可以配置爲 secure_file_priv= ,這種就是隨便你往哪裏導入都行,前提是mysql的用戶組具備這個目錄的寫權限,否則依舊會提示錯誤。

配置完了之後重啓MySQL即可。

在此期間出現了一個小插曲:

由於修改my.cnf的時候系統提示只可讀,不可以寫,於是我將my.cnf文件的權限改爲所有可讀可寫,但是還是不行,因爲他的上一級目錄還是隻讀的,於是又把上一級的文件夾改爲所有人可讀可寫。

但是在重啓的時候,提示我

World-writable config file ‘/etc/my.cnf’ is ignored

後來發現,這是MySQL的一個策略,MySQL的文件夾是不允許所有人可讀可寫的,否則就會出現這種錯誤,關不了或者啓動不了。於是又把剛纔改的所有權限改回去,重啓之後再執行導出,導出到mysql用戶組具備的權限的目錄下。

導入:

load data infile '文件地址' into table tablename fields terminated by ',';例子如下:

load data infile '/usr/local/mysql8/city.txt' into table city fields terminated by ',';

 將city.txt文件裏的數據導入到city表中。

10幾萬的數據一秒之內分分鐘搞定,很快的。

注意:

1、如果是本地文件向服務器上的MySQL導入,那麼需要加上LOCAL 參數

命令就變成了

load data LOCAL infile '/usr/local/mysql8/city.txt' into table city fields terminated by ',';

2、如果導入的數據中存在字符串、數字,但是隻有字符串是用""包起來的,那麼可以加入[FIELDS/COLUMS] optionally enclosed by '具體的符號',

命令變成了

load data LOCAL infile '/usr/local/mysql8/city.txt' into table city fields terminated by ',',optionally enclosed by '"';

因爲前面已經有了fields了,所以在optionally前面就不需要加fields標識了

3、如果數據庫中已存在了部分數據,而此時導入的數據中也存在了和數據庫一樣的數據,唯一約束是一致的,主鍵或者唯一索引一致,那麼默認情況下,MySQL導入的時候是不會導入這部分相同的數據的(也就是默認的參數IGNORE),如果,想要導入的數據替換數據庫中已存在的數據,則使用REPLACE參數

命令變成了

load data LOCAL infile REPLACE '/usr/local/mysql8/city.txt' into table city fields terminated by ',',optionally enclosed by '"';

4、如果只想導入導入數據的部分列,或者在導入的時候設置一些列的默認值,則可以在導入命令最後設置,一定是放在最後的位置

命令變成了

load data LOCAL infile REPLACE '/usr/local/mysql8/city.txt' into table city fields terminated by ',',optionally enclosed by '"' (name,age,gender,created) set created = now();

5、在導入的時候,需要告知MySQL,區分一條數據的分隔符是什麼,使用 LINES terminated by ''

命令變成了

load data LOCAL infile REPLACE '/usr/local/mysql8/city.txt' into table city fields terminated by ',',optionally enclosed by '"', Lines terminated by '\r' (name,age,gender,created) set created = now();

綜上所述:

將本地文件導入服務器的MySQL實例中,

對重複數據採用更新數據的方式,

每條數據以換行符作爲分隔標誌,

每個字段以逗號作爲分隔標誌,

對於數據中的字符串使用雙引號進行區分,

只導入name,age,genter這三列,對數據庫中的created設置默認值爲當前時間

 

 

到此爲止MySQL的導入和導出基本完成。上面的兩種方式還有許多參數沒介紹,有興趣的可以去官方文檔瞭解下。

官方也提供了mysqldump和mysqlimport這兩種,其實和上面的一樣,有興趣的可以瞭解下。

 

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