本文介绍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