centos mysql初探 -- 配置、基本操作及問題


目錄:

  • 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即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM