目錄:
- centos安裝mysql
- 使用mysql客戶端進行簡單操作
- python2和python3連接mysql
- mysql導入文件問題
- 死鎖解決辦法
- windows 7 遠程連接 mysql 服務器
1、centos安裝mysql
驗證是否已有mysql:rpm -qa | grep mysql
在官網 https://dev.mysql.com/downloads/repo/yum/ 下載rpm,注意下載第一個:
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
下載到本地之后,開始yum安裝:
rpm -ivh mysql57-community-release-el7-9.noarch.rpm yum install mysql-server
啟動mysql(注意啟動只能有管理員權限的用戶才可以啟動):
sudo systemctl start mysqld
同理停止mysql也只能用管理員權限才可以停止:
sudo service stop mysqld
查看mysql運行狀態:
systemctl status mysqld
驗證mysql的安裝:
mysqladmin --version
mysqladmin Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)
2、使用客戶端進行簡單的操作
打開mysql,這里出現了一些問題,輸入mysql時出現:
ERROR 1045 (28000): Access denied for user 'fangying'@'localhost' (using password: NO)
解決辦法:
找到密碼:
cat /var/log/mysqld.log | grep password
2018-06-12T05:16:18.752589Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: =h8p&,-IffXs
再用此密碼登錄即可:(-h是localhost時可以省略,其余的ip不可以省略)
/usr/bin/mysql -h localhost -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.11
查看表之前會讓你進行重設密碼:
mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. mysql> alter user 'root'@'localhost' identified by 'your password'; Query OK, 0 rows affected (0.04 sec)
此時再次查看表示就可以了:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
3、python2和python3連接mysql
python2可以通過MySQLdb模塊來連接mysql,python3則可以通過pymysql來連接mysql:
注意,這里遇到了一個問題:在mysql的客戶端可以連接mysql的用戶名和密碼,在python3連接時,一直提示:
OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")
查找了非常多的資料,知道了出現這個錯誤提示的原因應該是,沒找到密碼,比如沒輸入密碼,這個混淆使得我找了很久都找不到解決的辦法,因為實際上這個提示不夠明確!
在使用python2中的MySQLdb模塊去連接mysql時的錯誤提示是:
password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory")
用這個錯誤提示去查找解決辦法時,立刻就找到了:創建用戶使用 mysql_native_password密碼(雖然也不是完全一樣的問題,但是的確問題得到了解決)
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'pMQiEge1ikst7S_6tlXzBOmt_4b'; grant all on *.* to 'root'@'%';
問題在於MySQL8.0.11版本默認的認證方式是caching_sha2_password (而在MySQL5.7版本則為mysql_native_password),為了修改默認認證方式(之后創建密碼時),可以修改配置文件/etc/my.cnf:
另:
centos7 python2中MySQLdb模塊的安裝:
yum install MySQL-python import MySQLdb
4、mysql的導入問題
1)將本地文件導入到mysql中
將本地文件導入到mysql中,需要指定local_infile這個參數為開啟的狀態,而做到這一點需要在安裝的時候編譯源碼安裝,且指定 --enable-local-infile,默認是不啟動的(我安裝的時候並沒有這么做):
./configure --prefix=/usr/local/mysql --enable-local-infile make install
所以這個方法就不行了;
如果編譯的時候沒有這么做,又不想重新編譯的話,那就可以在連接數據庫時加入 --local-infile:
mysql -u echo -p --local-infile
此時在導入數據時要用 load data local 而不是 load data(這樣會出錯):
load data local infile '/home/fangying/GAna/aod_csv/aod_all_2015_1.csv' into table example fields terminated by ',' ignore 1 lines;
或者在配置文件/etc/my.cnf的[mysql]和[mysqld]都加上 local-infile=1,隨后登錄時不加 --local-infile也可以導入本地文件。
若有空值的話,需要把空值處改為‘\n’,否則對於數值型會把空值設為0,對於日期會把空值設為0000-00-00,還可以如下導入也可以使得:(如果想顯示警告的話:--show-warnings )
load data local infile '/home/fangying/GAna/aod_csv/aod_all_2015_1.csv' into table example2 fields terminated by ',' ignore 1 lines (id,x,y,@vaod_value,ele,prs,tem,rhu,merra2,date_,win_avg) set aod_value=nullif(@vaod_value,'');
已解決的問題1:
將本地的文件導入到mysql中時,出現了錯誤:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
這個錯誤的原因是 --secure-file-priv 參數的設置問題,secure_file_priv參數用於限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()傳到哪個指定目錄。
- secure_file_priv 為 NULL 時,表示限制mysqld不允許導入或導出。
- secure_file_priv 為 /tmp 時,表示限制mysqld只能在/tmp目錄中執行導入導出,其他目錄不能執行。
- secure_file_priv 沒有值時,表示不限制mysqld在任意目錄的導入導出。
查看這個值:
show global variables like 'secure_file_priv' Value Variable_name 0 /var/lib/mysql-files/ secure_file_priv
所以我們需要修改這個參數的值,打開配置文件/etc/my.cnf,加入:
secure_file_priv=''
再次查看變量值已經變成了 ‘’
已經解決的問題2:
在本地已經可以load data local了,但是在jupyter上還做不到這個:
這是因為我的jypyter添加的mysql kernel是直接用的git上面別人寫好的程序,在這個程序里面連接mysql用的是pymysql,只能指定常用的參數(host、user、password、port、charset),其他的參數都沒有考慮,所以就無法添加local_infile=1這個參數(可以修改源代碼),嫌麻煩就不做了。
python連接mysql時,只要指定了 local-infile=1 在操作時就可以local data local了。所以問題還是出在了 local infile 參數的問題上。
但是我比較不理解的是,我在本地客戶端連接mysql時只指定了一次 -- local-infile ,此后的連接都不指定這個參數,也是可以導入本地數據的,為什么呢?
2)將服務器上的文件導入到mysql中
使用load data,這里只可以上傳配置文件中datadir中指定的位置的文件(/var/lib/mysql)和緩存位置(/tmp),其他的位置上的文件都不行:
load data infile '/var/lib/mysql/a.txt' into table example fields terminated by ',' ignore 1 lines;
可以修改datadir的值,有點麻煩。
注意:這里提到了緩存位置,實際上load data本來就是把數據讀取到tmp位置中。
5、死鎖解決辦法
操作時出現以下錯誤提示:
1205, 'Lock wait timeout exceeded; try restarting transaction'
找出死鎖,殺死:
select * from information_schema.innodb_trx
kill 22
直接在mysql中執行kill操作。
6、windows7 遠程連接mysql 服務器
1)在centos 的mysql 服務器上創建一個允許ip為192.168.***.***的主機訪問的用戶並授權:(在mysql 8中必須先創建后授權,注意授權用戶的權限)
create user 'username'@'192.168.***.***' identified by 'your password'; grant all privileges on *.* to username@192.168.***.***;
注意:這里創建用戶的含義是ip為192.168.***.***的主機的username用戶可以訪問mysql服務器,並擁有這些權限。
2)在centos 開放mysql占用的端口:
sudo firewall-cmd --zone=public --add-port=3307/tcp --permanent
3)在windows 7命令行或者workbench連接即可:
mysql -h 192.168.***.*** -u username -p
在workbench中 ,database - connect database即可。