本文介紹mysql各類安裝方法(rpm/glibc通用二進制/源碼編譯)以及多實例配置的方法,沒什麼技術,算是一篇方法歸總文章。html
直接yum安裝mysql-server便可。但注意兩點:mysql
(1).centos7上,yum默認將安裝mariadb。
(2).centos6上,yum默認安裝的版本比較老(5.1版),要安裝mysql 5.6或mysql 5.7,能夠從官方下載,也可使用如下配置的yum源。linux
release=`awk -F "[ .]" '{print $4}' /etc/redhat-release` cat <<eof>/etc/yum.repos.d/mysql.repo [mysql56] name=MySQL baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/$release/\$basearch/ enabled=1 gpgcheck=0 [mysql57] name=MySQL baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/$release/\$basearch/ enabled=1 gpgcheck=0 eof
此外,在sohu鏡像站點也提供了mysql的各個rpm版本。地址:http://mirrors.sohu.com/mysql/sql
還需注意,配置了yum源後安裝Mysql將使用mysql-community-*安裝各mysql相關包,例如mysql-community-server。shell
安裝完成後,啓動mysqld。數據庫
shell> service mysqld start # 或 systemctl start mysqld
若是啓動失敗,則可能須要初始化MySQL。ubuntu
shell> mkdir -p /mydata/data
shell> chown -R mysql.mysql /mydata/data
shell> mysql_install_db --datadir=/mydata/data --user=mysql
若是使用mysql_install_db
初始化時提示該命令已經廢棄(5.7版本可能會如此提示),那麼使用下面的命令進行初始化。vim
# 初始化時,爲root@localhost建立一個臨時密碼存放在mysql.log中
shell> mysqld --initialize --datadir=/mydata/data --user=mysql
# 初始化時,爲root@localhost建立一個空密碼
shell> mysqld --initialize-insecure --datadir=/mydata/data --user=mysql
windows
centos
systemctl disable apparmor
重啓。而後再初始化(但也得給上root權限)
初始化後再啓動,啓動成功後鏈接數據庫並修改root@localhost
用戶的密碼,而後退出。
shell> mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
mysql> \q
若是前面使用mysqld --initialize
初始化數據庫,那麼將會爲"root@localhost"建立一個密碼,這將使得沒法直接使用mysql
命令鏈接數據庫。能夠先從mysql.log中篩選出建立的臨時密碼,而後再手動修改成"123456"。
shell> grep 'temporary password' /var/log/mysqld.log
shell> mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; mysql> \q
通用二進制包至關於windows中的便攜版軟件,解壓後稍微配置下就能夠直接使用,不用安裝。
mysql通用二進制版官方下載地址:
其中文件中的glibc2.12表示的是Linux系統的glibc版本要比2.12新,可使用ldd --version
查看glibc版本。在CentOS 6上glibc默認就是2.12的,因此無需顧慮。
shell> tar xf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
shell> ln -s /usr/local/mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
不使用rpm包安裝,就須要對mysql進行初始化以建立一些文件、庫和指定一些參數。但在初始化mysql前,要預先作一些操做。
shell> mkdir -p /mydata/data
shell> useradd -r -s /sbin/nologin mysql
shell> chown -R mysql.mysql /usr/local/mysql
shell> chown -R mysql.mysql /mydata/data
shell> cd /usr/local/mysql
shell> scripts/mysql_install_db --datadir=/mydata/data --user=mysql
shell> chown -R root.root /usr/local/mysql
執行mysql_install_db
時會在/tmp下建立臨時表,因此mysql用戶須要對/tmp有寫權限,不然執行實例初始化腳本時可能會報相似下面的錯誤:
ERROR: 1 Can't create/write to file '/tmp/#sql_7a0e_0.MYI' (Errcode: 13)
這說明沒有寫權限,因此須要修改/tmp目錄的權限:
chmod 1777 /tmp
一樣,mysql_install_db
初始時若是提示已廢棄,則使用以下方法:
bin/mysqld --initialize-insecure --datadir=/mydata/data --user=mysql
初始化完成後,提供配置文件和服務啓動腳本。
shell> cp -a support-files/mysql.server /etc/init.d/mysqld
shell> cp -a support-files/my-default.cnf /etc/my.cnf
# 修改my.cnf的datadir
shell> vim /etc/my.cnf
[mysqld]
datadir=/mydata/data
若是是centos7,則提供以下服務啓動腳本(若有必要,修改pid文件路徑)。
shell> cat /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/var/run/mysqld/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Start main service
ExecStart=/usr/local/mysql-5.7.19/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
修改"root@localhost"密碼。
shell> mysql
mysql> alter user 'root'@'localhost' identified by '123456';
mysql> \q
編譯安裝或通用二進制安裝後,通常都須要作一些額外的操做,包括設置環境變量、輸出頭文件和庫文件、設置man路徑。
echo "export PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
echo "MANPATH /usr/local/mysql/man" >>/etc/man.config
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
ldconfig
ln -s /usr/local/mysql/include /usr/include/mysql
建議別沒事找事,嘗試編譯裝MySQL,徹底是吃力不討好的事。若是確實要編譯安裝,把my.cnf、服務管理腳本、編譯選項等涉及到運行文件路徑的項確保相同,例如pid文件、socket文件、datadir路徑、log文件。並保證mysql涉及到的目錄全部者和所屬組都是mysql,例如默認的pid路徑/var/run/mysql/。
mysql源碼包下載地址:
關於編譯選項,見下文。
使用如下命令安裝mysql 5.6。
yum -y install ncurses-devel cmake tar xf ~/mysql-5.6.37.tar.gz cd ~/mysql-5.6.37 cmake . \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.37 \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \ -DENABLED_LOCAL_INFILE=ON \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITH_FAST_MUTEXES=1 \ -DWITH_EMBEDDED_SERVER=1 \ -DWITH_SSL=bundled \ -DWITH_DEBUG=0 make make install
使用如下命令安裝mysql 5.7。比上述多了最後一個boost相關設置項,不設置此項可能會cmake失敗。
yum -y install ncurses-devel cmake tar xf ~/mysql-5.7.19.tar.gz cd ~/mysql-5.7.19 cmake . \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.19 \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \ -DENABLED_LOCAL_INFILE=ON \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITH_FAST_MUTEXES=1 \ -DWITH_EMBEDDED_SERVER=1 \ -DWITH_SSL=bundled \ -DWITH_DEBUG=0 \ -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost make make install
若是是centos7,則加上一項-DWITH_SYSTEMD=1
,這會提供systemd腳本。
注意,上述編譯選項中沒有提供sysconfdir、datadir、pidfile和socket等mysql運行時文件類設置選項。雖然能夠設置,但不必,並且在作多實例的時候可能會出現問題。不過,能夠考慮加上MYSQL_UNIX_ADDR
項來設置socket路徑,由於不設置的話其會採用默認的/tmp/mysql.sock。
shell> ln -s /usr/local/mysql-5.6.37 /usr/local/mysql
shell> cd /usr/local/mysql
shell> useradd -r -s /sbin/nologin mysql
shell> mkdir -p /mydata/data
shell> chown -R mysql.mysql /mydata/data
shell> chmod o-rx /mydata/data
shell> chown -R mysql.mysql /usr/local/mysql
shell> scripts/mysql_install_db --user=mysql --datadir=/mydata/data
shell> cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
shell> cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
shell> chown -R root.root /usr/local/mysql
# 修改my.cnf的datadir、socket、log和pid路徑。
shell> vim /etc/my.cnf
[mysqld]
datadir=/mydata/data
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/mydata/data/mysql.log pid-file=/mydata/data/mysqld.pid
注:mysql 5.7建議採用以下語句進行初始化。
/usr/local/mysql/bin/mysqld --initialize-insecure --datadir=/mydata/data --user=mysql
若是是centos7,則提供systemd風格的服務管理腳本,並確認是否要修改pid文件路徑。
輸出頭文件、庫文件,設置PATH環境變量,設置man路徑。
echo "export PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
echo "MANPATH /usr/local/mysql/man" >>/etc/man.config
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
ldconfig
ln -s /usr/local/mysql/include /usr/include/mysql
-DCMAKE_INSTALL_PREFIX=dir_name
# MySQL的安裝位置-DINSTALL_PLUGINDIR=dir_name
# 插件安裝的目錄-DMYSQL_DATADIR=dir_name
# MySQL的data dir-DSYSCONFDIR=dir_name
# MySQL默認的配置文件(my.cnf)路徑-DTMPDIR=dir_name
# 臨時文件存放路徑,在MySQL5.6.16中才開始提供該選項存儲引擎是插件式的,可被靜態編譯到MySQL服務中,也能夠動態編譯成模塊,編譯成模塊時須要使用INSTALL PLUGIN
語句或者--plugin-load
選項來啓用。但某些插件是固化的,沒法指定是靜態編譯仍是動態編譯。
InnoDB,MyISAM,MERGE,MEMORY和CSV存儲引擎老是默認靜態編譯到MySQL服務中的,在編譯安裝的時候無需顯式指定它們。
編譯存儲引擎的時候,使用-DWITH_enginename_STORAGE_ENGINE=1
表示靜態編譯到MySQL。可選的引擎有:ARCHIVE、BLACKHOLE、EXAMPLE、FEDERATED、PARTITION(分區支持引擎)、PERFSCHEMA(Performance Schema)。如:
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1
使用-WITHOUT_enginename_STORAGE_ENGINE=1
表示顯式的排除這些引擎,即強制不使用它們。如:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
-DWITH_enginename_STORAGE_ENGINE
和-WITHOUT_enginename_STORAGE_ENGINE
都沒有指定某些引擎的話,這些引擎默認動態編譯成模塊,若是沒法動態編譯成模塊則不編譯。
-DDEFAULT_CHARSET=charset_name
設置默認字符集,默認爲latin1。例如,binary,ascii,big5 ,gb2312,gbk,latin1,latin2,latin5,latin7,utf8。
在cmake/character_sets.cmake文件中的CHARSETS_AVAILABLE定義了容許使用的字符集列表。
字符集的設置能夠在MySQL服務啓動的時候使用"--character_set_server"選項來指定。
-DDEFAULT_COLLATION=collation_name
設置默認的排序規則。默認排序規則爲latin1_swedish_ci。使用SHOW COLLATION
語句能夠查看每種字符集可使用的排序規則。
排序規則的設置能夠在MySQL服務啓動的時候使用--collation_server
選項來指定。
-DENABLED_LOCAL_INFILE=bool
Whether to enable LOCAL capability in the client library for LOAD DATA INFILE.
This option controls client-side LOCAL capability, but the capability can be set on the server side at server startup with the --local-infile option.
-DMYSQL_TCP_PORT=port_num
指定MySQL的TCP端口,默認是3306。能夠在啓動服務時使用--port選項指定。
-DMYSQL_UNIX_ADDR=file_name
指定MySQL的套接字路徑,必須是絕對路徑,默認是/tmp/mysql.sock。能夠在啓動服務時使用--port選項指定。
-DWITH_EXTRA_CHARSETS=name
Which extra character sets to include:
-DWITH_INNODB_MEMCACHED=bool
Whether to generate memcached shared libraries (libmemcached.so and innodb_engine.so).
-DWITH_SSL={ssl_type|path_name}
The type of SSL support to include (if any) or the path name to the OpenSSL installation to use.
-DWITH_ZLIB=zlib_type
mysql能夠實現多實例,但由於多實例會共用服務器資源,致使資源爭用,在某實例某一刻資源佔用不少時(高併發、慢查詢),其餘的實例會受到影響。
不管是rpm安裝、通用二進制安裝仍是編譯安裝,都有兩種方法實現多實例。
mysqld_multi {start|stop|restart} N
。N能夠是單個數字,也能夠是逗號分隔的多個數字,還能夠是短橫線表示的範圍數字。若是不是rpm包安裝的,則mysqld_multi
文件的路徑在support-files中,將其copy到/etc/init.d下便可(沒有原生態的systemd多實例服務管理腳本)。 mysqld_multi start 1,2,4-6
本文介紹第二種方法,並採用rpm包安裝的mysql實現多實例。再次說明,不管使用何種方式安裝mysql,均可以實現多實例,其實看明白下面配置的過程就知道了。
建立並設置datadir,並初始化、分別提供配置文件。
shell> mkdir -p /mydata/{3306,3307}/data
shell> chown -R mysql.mysql /mydata/{3306,3307}/data
shell> mysql_install_db --datadir=/mydata/3306/data --user=mysql
shell> mysql_install_db --datadir=/mydata/3307/data --user=mysql
shell> cp /etc/my.cnf /mydata/3306/my.cnf
shell> cp /etc/my.cnf /mydata/3307/my.cnf
若是是設置mysql 5.7的多實例,則初始化時使用以下命令替換上面的mysql_install_db
。
shell> mysqld --initialize-insecure --datadir=/mydata/3306/data --user=mysql
shell> mysqld --initialize-insecure --datadir=/mydata/3307/data --user=mysql
分別修改兩個配置文件。
#如下是3306實例的配置文件要修改的部分。
shell> vim /mydata/3306/my.cnf
[mysqld]
port=3306
datadir=/mydata/3306/data
socket=/mydata/3306/data/mysql.sock
server_id=1
[mysqld_safe]
log-error=/mydata/3306/data/mysqld.log
pid-file=/mydata/3306/data/mysqld.pid
#如下是3307實例的配置文件要修改部分。
shell> vim /mydata/3307/my.cnf
[mysqld]
port=3307
datadir=/mydata/3307/data
socket=/mydata/3307/data/mysql.sock
server_id=2
[mysqld_safe]
log-error=/mydata/3307/data/mysqld.log
pid-file=/mydata/3307/data/mysqld.pid
再分別提供服務管理腳本。
#!/bin/sh
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: 345 64 36
# description: MySQL database server.
# processname: mysqld
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
basedir=/usr
exec="$basedir/bin/mysqld_safe"
prog="mysqld"
port=3306
datadir="/mydata/$port/data"
socketfile="$datadir/mysql.sock"
errlogfile="$datadir/mysqld.log"
mypidfile="$datadir/mysqld.pid"
cnf="/mydata/$port/my.cnf"
# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60
# Set in /etc/sysconfig/mysqld, will be passed to mysqld_safe
MYSQLD_OPTS=
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/$prog
case $socketfile in
/*) adminsocket="$socketfile" ;;
*) adminsocket="$datadir/$socketfile" ;;
esac
start(){
[ -x $exec ] || exit 5
# check to see if it's already running
RESPONSE=$(/usr/bin/mysqladmin --no-defaults --socket="$adminsocket" --user=UNKNOWN_MYSQL_USER ping 2>&1)
if [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# Now start service
$exec $MYSQLD_OPTS --defaults-file="$cnf" --datadir="$datadir" --socket="$socketfile" \
--pid-file="$mypidfile" \
--basedir="$basedir" --user=mysql >/dev/null &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=$(/usr/bin/mysqladmin --no-defaults --socket="$adminsocket" --user=UNKNOWN_MYSQL_USER ping 2>&1) && break
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}
stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile"`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}
restart(){
stop
start
}
condrestart(){
[ -e $lockfile ] && restart || :
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?
使用下面的命令管理兩個實例:
service mysqld3306 {start|stop|status|restart} service mysqld3307 {start|stop|status|restart}
第一次啓動可能會失敗,也可能會警告和log相關的項,這是正常的,以後都會正常。
mysqld_safe
命令,所以使用mysqld
來啓動mysql實例。[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/mydata/3306/data/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Start main service
ExecStart=/usr/sbin/mysqld --defaults-file=/mydata/3306/my.cnf --basedir=/usr --daemonize $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
而後重載下systemd服務管理腳本。
systemctl daemon-reload
以後就可使用下面的命令管理兩個實例:
systemctl {start|stop|status|restart} mysqld3306 systemctl {start|stop|status|restart} mysqld3307
mariadb基本上算是mysql的另外一個實現,絕大多數以及基礎功能上和MySQL都相同。具體到安裝上,也基本徹底同樣。
在centos7上,直接yum install mysql-server
將默認安裝mariadb,若是配置了mysql的yum源,須要指定"mysql-community-server"才表示安裝mysql。
如下僅提供mariadb的各項資源下載地址,具體安裝方法見前文對應mysql安裝方法。我的建議,將mariadb的服務啓動腳本閱讀一遍,和MySQL的作個比較。
mariadb的鏡像站點:
[mariadb]
name=mariadb
baseurl=http://yum.mariadb.org/10.2.6/centos/6.6/$basearch/
#baseurl=http://yum.mariadb.org/10.2.6/centos/7.2/$basearch/
enabled=1
gpgcheck=0
mariadb各通用二進制版:
mariadb各類二進制版本:https://downloads.mariadb.org/mariadb/+releases/
mariadb 10.2.6 systemd版(centos7):http://ftp.hosteurope.de/mirror/archive.mariadb.org//mariadb-10.2.6/bintar-linux-systemd-x86_64/mariadb-10.2.6-linux-systemd-x86_64.tar.gz
mariadb 10.2.6 非systemd版(centos6):http://ftp.hosteurope.de/mirror/archive.mariadb.org//mariadb-10.2.6/bintar-linux-x86_64/mariadb-10.2.6-linux-x86_64.tar.gz
mariadb源碼包: http://ftp.hosteurope.de/mirror/archive.mariadb.org//mariadb-10.2.6/source/mariadb-10.2.6.tar.gz