.
.
.
.
.
今天折騰了一下午的時間,恢復了無數次虛擬機快照,終於在 Ubuntu 上把 mysql 安裝好了。
mysql 是從官網下載的:mysql-server_5.7.16-1ubuntu12.04_i386.deb-bundle.tar
系統是 32 位 Ubuntu 12.04 LTS。
首先把下載好的 mysql-server_5.7.16-1ubuntu12.04_i386.deb-bundle.tar 放到虛擬機的 ~/tmp 目錄下,然后進入該目錄開始安裝。
user@user-virtual-machine:~$ mkdir tmp user@user-virtual-machine:~$ cd tmp/ user@user-virtual-machine:~/tmp$ sudo apt-get install libaio1 [sudo] password for user: Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: libaio1 # ... 此處省略n行... user@user-virtual-machine:~/tmp$ tar xf mysql-server_5.7.16-1ubuntu12.04_i386.deb-bundle.tar user@user-virtual-machine:~/tmp$ sudo dpkg -i mysql-common_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... user@user-virtual-machine:~/tmp$ sudo dpkg -i libmysqlclient20_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... user@user-virtual-machine:~/tmp$ sudo dpkg -i libmysqlclient-dev_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... user@user-virtual-machine:~/tmp$ sudo dpkg -i libmysqld-dev_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... user@user-virtual-machine:~/tmp$ sudo dpkg -i mysql-community-client_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... user@user-virtual-machine:~/tmp$ sudo dpkg -i mysql-client_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... user@user-virtual-machine:~/tmp$ sudo dpkg -i mysql-community-server_5.7.16-1ubuntu12.04_i386.deb # ... 此處省略n行... update-alternatives: using /etc/mysql/mysql.cnf to provide /etc/mysql/my.cnf (my.cnf) in auto mode. .. * MySQL Community Server 5.7.16 is started Processing triggers for ureadahead ... ureadahead will be reprofiled on next reboot Processing triggers for man-db ... user@user-virtual-machine:~/tmp$
解釋下上面的操作:
我們要先安裝 libaio1 這個庫,不然如果先安裝了 mysql ,一會兒報缺少這個庫的時候,再回頭來安裝這個包就會裝不上,不知道為啥,LZ 閃回了無數次虛擬機快照才摸清這個套路。= =||
然后把 mysql 的安裝包 mysql-server_5.7.16-1ubuntu12.04_i386.deb-bundle.tar 解壓縮出來,會釋放出好幾個文件,一定要按照上面的順序安裝!!!這個也是 LZ 分析了好久的錯誤信息才摸清的套路。。
當然也可以寫成一條語句,如果你不怕期間執行出錯的話:
sudo dpkg -i mysql-common_5.7.16-1ubuntu12.04_i386.deb libmysqlclient20_5.7.16-1ubuntu12.04_i386.deb libmysqlclient-dev_5.7.16-1ubuntu12.04_i386.deb libmysqld-dev_5.7.16-1ubuntu12.04_i386.deb mysql-community-client_5.7.16-1ubuntu12.04_i386.deb mysql-client_5.7.16-1ubuntu12.04_i386.deb mysql-community-server_5.7.16-1ubuntu12.04_i386.deb
注意:在安裝最后一個包的時候,也就是 mysql-community-server_5.7.16-1ubuntu12.04_i386.deb 這個包的時候,會提示設置 mysql 數據庫的 root 密碼。
確認密碼之后,直到我們看到這句出現了,就說明安裝好了,並且 mysql 服務也已經幫我們啟動好了。
* MySQL Community Server 5.7.16 is started
這時候如果想要驗證一下可以使用如下命令進行簡單測試:
user@user-virtual-machine:~/tmp$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.16 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.03 sec) mysql> exit Bye user@user-virtual-machine:~/tmp$
-u 參數后面跟的是登錄數據庫的用戶名;
-p 表示使用密碼登錄。
登陸之后,使用 show databases; 就可以看到現有的數據庫了。
----------------------------------------就這么結束了豈不是太沒勁----------------------------------------
下面 LZ 開始了新的作死之旅,修改數據庫路徑。
默認情況下,數據庫保存在 /var/lib/mysql 目錄下。由於一般情況下 LZ 會單獨給 /home 一個分區,但並不會給 /var 一個分區,所以為了安全起見,LZ 決定把數據庫搬到 /home/mysqldata 目錄中。
注意哦,單純的 mv 可不行,必須進行一些配置才能讓 mysql 知道自己數據的新家在哪。
user@user-virtual-machine:~/tmp$ sudo service mysql stop ... * MySQL Community Server 5.7.16 is stopped user@user-virtual-machine:~/tmp$ cd /home/ user@user-virtual-machine:/home$ sudo cp -arp /var/lib/mysql . user@user-virtual-machine:/home$ sudo mv mysql mysqldata user@user-virtual-machine:/home$ ll total 16 drwxr-xr-x 4 root root 4096 Nov 21 21:25 ./ drwxr-xr-x 23 root root 4096 Nov 21 17:10 ../ drwxr-x--- 5 mysql mysql 4096 Nov 21 21:25 mysqldata/ drwxr-xr-x 22 user user 4096 Nov 21 21:25 user/ user@user-virtual-machine:/home$
首先把 mysql 服務停下來,然后把它的數據拷貝的目的地,也就是把 /var/lib/mysql 拷貝到 /home/mysqldata。
注意 cp 命令的參數,-arp 是遞歸復制並且保留權限。
一定要復制完畢之后再改名:mv mysql mysqldata,不然直接復制的話權限可能會出問題,像這樣:cp /var/lib/mysql ./mysqldata。當然這一步不改名字也是可以的,LZ 就是不想用 mysql 這個名字嘛。
接下來進行配置:
user@user-virtual-machine:/home$ sudo vim /etc/init.d/mysql
編輯 /etc/init.d/mysql 腳本,搜索 datadir 之類的關鍵字,修改成類似如下的樣子:
# MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql") MYSQLDATA=$(get_mysql_option mysqld datadir "/home/mysqldata")
第一行是被注釋掉了,LZ 沒有刪掉它,第二行是修改之后的樣子。
這個文件在不同版本上可能會不一樣,因為 LZ 在 baidu 上查的都不是這種寫法,所以各位在修改的時候也要看情況適當修改。
接下來修改另一個腳本:
user@user-virtual-machine:/home$ sudo vim -p /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf 2 files to edit
LZ 這次一下打開了兩個文件,目的就是為了把 /etc/mysql/mysql.conf.d/mysqld.cnf 文件里的內容抄一份到 /etc/mysql/my.cnf 文件中。
實際生效的當然是 /etc/mysql/my.cnf 文件啦,這里有一點需要注意:系統中可能會存在多個 my.cnf,后讀取的會覆蓋先讀取的配置,如果想知道你的系統是按照什么順序讀取的,可以用下面這種方式查看,免得改完之后找不到不生效的原因:
user@user-virtual-machine:/home$ mysql --help | grep my.cnf /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf user@user-virtual-machine:/home$
可以看出來,LZ 這里的優先級是 /etc/my.cnf < /etc/mysql/my.cnf < ~/.my.cnf。當然,實際情況是 LZ 的系統里只有 /etc/mysql/my.cnf 這一個文件,另外兩個都沒有創建,所以 LZ 當然是理所當然的修改這個文件啦。
修改前:
# ... 上面省略 n 行注釋 ...
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
修改后:
#... 上面省略 n 行注釋 ... # !includedir /etc/mysql/conf.d/ # !includedir /etc/mysql/mysql.conf.d/ [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /home/mysqldata log-error = /var/log/mysql/error.log # By default we only accept connections from localhost bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0
之前 LZ 在網上查的帖子說還要把 socket 文件修改成 /home/mysqldata/mysql/mysql.sock,經過實驗,千萬別改這個路徑,不然以后你每次使用 mysql 客戶端的時候命令就得變成這個樣子才能正常連接數據庫:
user@user-virtual-machine:/home$ mysql -u root -p -S /home/mysqldata/mysql/mysql.sock
user@user-virtual-machine:/home$
其實只需要把 /etc/mysql/mysql.conf.d/mysqld.cnf 文件里的內容拷貝過來,然后修改一下 datadir 字段就行了。
----------------------------------------你以為這就完事了?太天真了,騷年----------------------------------------
LZ 高興的執行了 sudo service mysql start,然而..........根本無法啟動好嘛!!
莫非是權限不對?莫非是某個配置文件沒有改干凈?
LZ 嘗試了無數次 chown -R mysql:mysql mysqldata 和 sudo service mysql stop/start,然而並沒有什么卵用。
后來在茫茫網絡中發現了一根救命稻草(文末有連接),原來是安全機制搞得鬼。
接着改:
user@user-virtual-machine:/home$ sudo vim /etc/apparmor.d/usr.sbin.mysqld
果然在這個文件里找到了修改之前的 mysql 數據庫路徑:/var/lib/mysql。
改成這個樣子:
# Allow data dir access # /var/lib/mysql/ r, # /var/lib/mysql/** rwk, /home/mysqldata/ r, /home/mysqldata/** rwk,
照葫蘆畫瓢,把原來的路徑給注釋掉,把新的路徑給配置上。
重啟 apparmor 服務:
user@user-virtual-machine:/home$ sudo service apparmor restart * Reloading AppArmor profiles Skipping profile in /etc/apparmor.d/disable: usr.bin.firefox Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd [ OK ] user@user-virtual-machine:/home$
好了,接下來終於可以啟動 mysql 服務了:
user@user-virtual-machine:/home$ sudo service mysql start .. * MySQL Community Server 5.7.16 is started user@user-virtual-machine:/home$
哇咔咔咔,啟動成功啦,趕緊試試吧。
user@user-virtual-machine:/home$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.16 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.03 sec) mysql> create database live; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | live | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> exit Bye user@user-virtual-machine:/home$ sudo ls mysqldata/ auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 live mysqld_safe.pid private_key.pem server-cert.pem sys ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 mysql performance_schema public_key.pem server-key.pem user@user-virtual-machine:/home$
上面 LZ 創建了一個叫做 live 的新庫,並且可以看到,在 /home/mysqldata 目錄下已經有 live 這個目錄了,說明新庫遷移成功!
最后一步我們就可以放心的把舊庫給刪除了。(你是不是把它給忘了?)
user@user-virtual-machine:/home$ sudo rm -rf /var/lib/mysql user@user-virtual-machine:/home$
參考資料:
mysql提示[Warning] Cant create test file xxx lower-test