總所周知,,MySQL 被 Oracle 收購后,,CentOS 的鏡像倉庫中提供的默認(rèn)的數(shù)據(jù)庫也變?yōu)榱?MariaDB,如果想了解 MariaDB 和 CentOS 的區(qū)別,,可以參考官網(wǎng)介紹,,想用 MariaDB 的同學(xué)可以參考 MariaDB 安裝指南
言歸正傳,,在 CentOS 上安裝 MySQL 差不多有四個(gè)步驟
添加 MySQL YUM 源
根據(jù)自己的操作系統(tǒng)選擇合適的安裝源,和其他公司一樣,,總會(huì)讓大家注冊賬號(hào)獲取更新,注意是 Oracle 的賬號(hào),,如果不想注冊,,下方有直接下載的地址,,下載之后通過 rpm -Uvh
安裝,。
$wget 'https://dev./get/mysql57-community-release-el7-11.noarch.rpm'
$sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
$yum repolist all | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community 36
mysql-tools-community/x86_64 MySQL Tools Community 47
mysql57-community/x86_64 MySQL 5.7 Community Server 187
先解釋下為什么下載的是 5.7 版本的,,現(xiàn)在最新的是 5.7 版本的,當(dāng)然官網(wǎng)默認(rèn)都是最新版本的,,但是下載的頁面也有說明
The MySQL Yum repository includes the latest versions of:
MySQL 8.0 (Development)
MySQL 5.7 (GA)
MySQL 5.6 (GA)
MySQL 5.5 (GA - Red Hat Enterprise Linux and Oracle Linux Only)
MySQL Cluster 7.5 (GA)
MySQL Cluster 7.6 (Development)
MySQL Workbench
MySQL Fabric
MySQL Router (GA)
MySQL Utilities
MySQL Connector / ODBC
MySQL Connector / Python
MySQL Shell (GA)
也就是說這個(gè)安裝源包含了上面列舉的這些版本,,當(dāng)然包括 5.6 版本的。
選擇安裝版本
如果想安裝最新版本的,直接使用 yum 命令即可
$sudo yum install mysql-community-server
如果想要安裝 5.6 版本的,,有2個(gè)方法,。命令行支持 yum-config-manager
命令的話,可以使用如下命令:
$ sudo dnf config-manager --disable mysql57-community
$ sudo dnf config-manager --enable mysql56-community
$ yum repolist | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community 36
mysql-tools-community/x86_64 MySQL Tools Community 47
mysql56-community/x86_64 MySQL 5.6 Community Server 327
或者直接修改 /etc/yum.repos.d/mysql-community.repo
這個(gè)文件
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo./yum/mysql-5.6-community/el/7/$basearch/
enabled=1 #表示當(dāng)前版本是安裝
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo./yum/mysql-5.7-community/el/7/$basearch/
enabled=0 #默認(rèn)這個(gè)是 1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
通過設(shè)置 enabled
來決定安裝哪個(gè)版本,。
設(shè)置好之后使用 yum
安裝即可,。
啟動(dòng) MySQL 服務(wù)
啟動(dòng)命令很簡單
$sudo service mysqld start
$sudo systemctl start mysqld #CentOS 7
$sudo systemctl status mysqld
● mysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2017-05-27 12:56:26 CST; 15s ago
Process: 2482 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
Process: 2421 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 2481 (mysqld_safe)
CGroup: /system.slice/mysqld.service
├─2481 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
└─2647 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/...
說明已經(jīng)正在運(yùn)行中了。
對于 MySQL 5.7 版本,,啟動(dòng)的時(shí)候如果數(shù)據(jù)為空的,,則會(huì)出現(xiàn)如下提示
The server is initialized.
An SSL certificate and key files are generated in the data directory.
The validate_password plugin is installed and enabled.
A superuser account 'root'@'localhost' is created. A password for the superuser is set and stored in the error log file.To reveal it, use the following command:
sudo grep 'temporary password' /var/log/mysqld.log
簡單的說就是服務(wù)安裝好了,SSL 認(rèn)證的文件會(huì)在 data 目錄中生存,,密碼不要設(shè)置的太簡單了,初始密碼通過下面的命令查看,,趕緊去改密碼吧,。
安裝提示,查看密碼,,登錄數(shù)據(jù)庫,然后修改密碼:
$ mysql -uroot -p #輸入查看到的密碼
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
MySQL 5.6 的安全設(shè)置
由于 5.7 版本在安裝的時(shí)候就設(shè)置好了,,不需要額外設(shè)置,,但是 5.6 版本建議從安全角度完善下,,運(yùn)行官方腳本即可
$ mysql_secure_installation
會(huì)提示設(shè)置5個(gè)關(guān)鍵位置
- 設(shè)置 root 密碼
- 禁止 root 賬號(hào)遠(yuǎn)程登錄
- 禁止匿名賬號(hào)(anonymous)登錄
- 刪除測試庫
- 是否確認(rèn)修改
安裝第三方組件
查看 yum 源中有哪些默認(rèn)的組件:
$ yum --disablerepo=\* --enablerepo='mysql*-community*' list available
需要安裝直接通過 yum
命令安裝即可。
修改編碼
在 /etc/my.cnf
中設(shè)置默認(rèn)的編碼
[client]
default-character-set = utf8
[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci #不區(qū)分大小寫
collation-server = utf8_bin #區(qū)分大小寫
collation-server = utf8_unicode_ci #比 utf8_general_ci 更準(zhǔn)確
創(chuàng)建數(shù)據(jù)庫和用戶
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE <datebasename> CHARACTER SET utf8;
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
GRANT privileges ON databasename.tablename TO 'username'@'host';
SHOW GRANTS FOR 'username'@'host';
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
DROP USER 'username'@'host';
其中
- username:你將創(chuàng)建的用戶名
- host:指定該用戶在哪個(gè)主機(jī)上可以登陸,,如果是本地用戶可用 localhost,,如果想讓該用戶可以從任意遠(yuǎn)程主機(jī)登陸,,可以使用通配符 %
- password:該用戶的登陸密碼,,密碼可以為空,如果為空則該用戶可以不需要密碼登陸服務(wù)器
- privileges:用戶的操作權(quán)限,,如 SELECT,,INSERT,UPDATE 等,,如果要授予所的權(quán)限則使用ALL
- databasename:數(shù)據(jù)庫名
- tablename:表名,如果要授予該用戶對所有數(shù)據(jù)庫和表的相應(yīng)操作權(quán)限則可用 * 表示,,如 *.*
Django 中使用 MySQL
Django 默認(rèn)使用的是 sqlite3 數(shù)據(jù)庫,,可以修改如下
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/path/to/my.cnf',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" ,
'isolation_level':'read committed',
'init_command': 'SET default_storage_engine=INNODB',
},
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
# my.cnf
[client]
database = 'mydatabase'
user = 'mydatabaseuser'
password = 'mypassword'
default-character-set = utf8
重點(diǎn)關(guān)注下 OPTIONS
選項(xiàng),它會(huì)優(yōu)先與下面的配置項(xiàng),。在 Django 官方文檔說明中,,主要強(qiáng)調(diào)了 init_command
, isolation_level
這兩個(gè)選項(xiàng)的設(shè)置。
init_command
為了防止數(shù)據(jù)的丟失,,mysql 5.7 和新裝的 5.6 版本都新增加了一個(gè)模式 STRICT_TRANS_TABLES
,在這個(gè)模式下,,如果插入數(shù)據(jù)中斷就會(huì)報(bào)錯(cuò),而不是僅僅之前的警告,。之前的模式默認(rèn)為 NO_ENGINE_SUBSTITUTION
. 所以也建議設(shè)置為 STRICT_TRANS_TABLES
或者 STRICT_ALL_TABLES
. 在選項(xiàng)中設(shè)置或者在數(shù)據(jù)庫中設(shè)置都可以的,。
isolation_level
這是在 Django 1.11 版本中新增加的一個(gè)選擇,,當(dāng)運(yùn)行并發(fā)負(fù)載時(shí),來自不同會(huì)話的數(shù)據(jù)庫事務(wù)(例如,,處理不同請求的單獨(dú)線程)可能會(huì)相互交互,這些交互受每個(gè)會(huì)話的事務(wù)隔離級(jí)別的影響,。默認(rèn)有 5 個(gè)隔離級(jí)別,,默認(rèn)為 REPEATABLE-READ
mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set (0.00 sec)
- read uncommitted
# SELECT的時(shí)候允許臟讀,,即SELECT會(huì)讀取其他事務(wù)修改而還沒有提交的數(shù)據(jù)。
- read committed
# SELECT的時(shí)候無法重復(fù)讀,,即同一個(gè)事務(wù)中兩次執(zhí)行同樣的查詢語句,,若在第一次與第二次查詢之間時(shí)間段,其他事務(wù)又剛好修改了其查詢的數(shù)據(jù)且提交了,,則兩次讀到的數(shù)據(jù)不一致。
- repeatable read
# SELECT的時(shí)候可以重復(fù)讀,,即同一個(gè)事務(wù)中兩次執(zhí)行同樣的查詢語句,,得到的數(shù)據(jù)始終都是一致的。實(shí)現(xiàn)的原理是,,在一個(gè)事務(wù)對數(shù)據(jù)行執(zhí)行讀取或?qū)懭氩僮鲿r(shí)鎖定了這些數(shù)據(jù)行。但是這種方式又引發(fā)了幻想讀的問題。因?yàn)橹荒苕i定讀取或?qū)懭氲男?,不能阻止另一個(gè)事務(wù)插入數(shù)據(jù),后期執(zhí)行同樣的查詢會(huì)產(chǎn)生更多的結(jié)果,。數(shù)據(jù)庫默認(rèn)的級(jí)別,。
- serializable
# 與可重復(fù)讀的唯一區(qū)別是,,默認(rèn)把普通的SELECT語句改成SELECT …. LOCK IN SHARE MODE,。即為查詢語句涉及到的數(shù)據(jù)加上共享瑣,阻塞其他事務(wù)修改真實(shí)數(shù)據(jù),。serializable模式中,,事務(wù)被強(qiáng)制為依次執(zhí)行。
- None
# 無隔離級(jí)別
MySQL 修改時(shí)間戳為服務(wù)器時(shí)間
mysql 中默認(rèn)的時(shí)間戳是 UTC 時(shí)間,,需要改為服務(wù)器時(shí)間的話官網(wǎng)提供了 3 種方式
$ mysql_tzinfo_to_sql tz_dir
$ mysql_tzinfo_to_sql tz_file tz_name
$ mysql_tzinfo_to_sql --leap tz_file
tz_dir 代表服務(wù)器時(shí)間數(shù)據(jù)庫,,CentOS 7 中默認(rèn)的目錄為 /usr/share/zoneinfo
,tz_name 為具體的時(shí)區(qū),。如果設(shè)置的時(shí)區(qū)需要閏秒,則使用 --leap
,,具體的用法如下:
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
$ mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
$ mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql