我司現在全面切換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 工具導入,
接送數據如下:
一步步操作即可,導入後發現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這兩種,其實和上面的一樣,有興趣的可以瞭解下。