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

目錄:python

  • centos安裝mysql
  • 使用mysql客戶端進行簡單操做
  • python2和python3鏈接mysql
  • mysql導入文件問題
  • 死鎖解決辦法
  • windows 7 遠程鏈接 mysql 服務器

 

一、centos安裝mysql

驗證是否已有mysql:rpm -qa | grep mysqlmysql

在官網 https://dev.mysql.com/downloads/repo/yum/ 下載rpm,注意下載第一個:git

wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

下載到本地以後,開始yum安裝:sql

rpm -ivh mysql57-community-release-el7-9.noarch.rpm
yum install mysql-server

啓動mysql(注意啓動只能有管理員權限的用戶才能夠啓動):數據庫

sudo systemctl start mysqld

同理中止mysql也只能用管理員權限才能夠中止:windows

sudo service stop mysqld

查看mysql運行狀態:centos

systemctl status mysqld

驗證mysql的安裝:緩存

mysqladmin --version

 mysqladmin Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)服務器

 

二、使用客戶端進行簡單的操做

打開mysql,這裏出現了一些問題,輸入mysql時出現:tcp

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)

 

三、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

 

四、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位置中

 

五、死鎖解決辦法

操做時出現如下錯誤提示:

1205, 'Lock wait timeout exceeded; try restarting transaction'

找出死鎖,殺死:

select * from information_schema.innodb_trx

kill 22

直接在mysql中執行kill操做。

 

六、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便可。

相關文章
相關標籤/搜索