本文介绍mysql各种安装方法(rpm/glibc通用二进制/源码编译)以及多实例配置的方法,没什么技术,算是一篇方法归总文章。
直接yum安装mysql-server即可。但注意两点:
(1).centos7上,yum默认将安装mariadb。
(2).centos6上,yum默认安装的版本比较老(5.1版),要安装mysql 5.6或mysql 5.7,可以从官方下载,也可以使用以下配置的yum源。
release=`awk -F "[ .]" '{print $4}' /etc/redhat-release`cat <<eof>/etc/yum.repos.d/mysql.repo[mysql56]name=MySQLbaseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/$release/\$basearch/enabled=1gpgcheck=0[mysql57]name=MySQLbaseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/$release/\$basearch/enabled=1gpgcheck=0eof
此外,在sohu镜像站点也提供了mysql的各个rpm版本。地址:http://mirrors.sohu.com/mysql/
还需注意,配置了yum源后安装Mysql将使用mysql-community-*安装各mysql相关包,例如mysql-community-server。
安装完成后,启动mysqld。
shell> service mysqld start # 或 systemctl start mysqld
如果启动失败,则可能需要初始化MySQL。
shell> mkdir -p /mydata/datashell> chown -R mysql.mysql /mydata/datashell> mysql_install_db --datadir=/mydata/data --user=mysql
如果使用mysql_install_db
初始化时提示该命令已经废弃(5.7版本可能会如此提示),那么使用下面的命令进行初始化。
# 初始化时,为root@localhost创建一个临时密码存放在mysql.log中shell> mysqld --initialize --datadir=/mydata/data --user=mysql# 初始化时,为root@localhost创建一个空密码shell> mysqld --initialize-insecure --datadir=/mydata/data --user=mysql
初始化后再启动,启动成功后连接数据库并修改root@localhost
用户的密码,然后退出。
shell> mysqlmysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';mysql> \q
如果前面使用mysqld --initialize
初始化数据库,那么将会为"root@localhost"创建一个密码,这将使得无法直接使用mysql
命令连接数据库。可以先从mysql.log中筛选出创建的临时密码,然后再手动修改为"123456"。
shell> grep 'temporary password' /var/log/mysqld.logshell> mysql -uroot -pmysql> 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/datashell> useradd -r -s /sbin/nologin mysqlshell> chown -R mysql.mysql /usr/local/mysqlshell> chown -R mysql.mysql /mydata/datashell> cd /usr/local/mysqlshell> scripts/mysql_install_db --datadir=/mydata/data --user=mysqlshell> 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/mysqldshell> cp -a support-files/my-default.cnf /etc/my.cnf # 修改my.cnf的datadirshell> vim /etc/my.cnf [mysqld]datadir=/mydata/data
如果是centos7,则提供如下服务启动脚本(如有必要,修改pid文件路径)。
shell> cat /usr/lib/systemd/system/mysqld.service[Unit]Description=MySQL ServerDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=mysqlGroup=mysqlType=forkingPIDFile=/var/run/mysqld/mysqld.pid# Disable service start and stop timeout logic of systemd for mysqld service.TimeoutSec=0# Start main serviceExecStart=/usr/local/mysql-5.7.19/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS# Use this to switch malloc implementationEnvironmentFile=-/etc/sysconfig/mysql# Sets open_files_limitLimitNOFILE = 5000Restart=on-failureRestartPreventExitStatus=1PrivateTmp=false
修改"root@localhost"密码。
shell> mysqlmysql> alter user 'root'@'localhost' identified by '123456';mysql> \q
编译安装或通用二进制安装后,一般都需要做一些额外的操作,包括设置环境变量、输出头文件和库文件、设置man路径。
echo "export PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysql.shchmod +x /etc/profile.d/mysql.shsource /etc/profile.d/mysql.shecho "MANPATH /usr/local/mysql/man" >>/etc/man.configecho "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.confldconfigln -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 cmaketar xf ~/mysql-5.6.37.tar.gzcd ~/mysql-5.6.37cmake . -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 makemake install
使用以下命令安装mysql 5.7。比上述多了最后一个boost相关设置项,不设置此项可能会cmake失败。
yum -y install ncurses-devel cmaketar xf ~/mysql-5.7.19.tar.gzcd ~/mysql-5.7.19cmake . -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/boostmakemake 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/mysqlshell> cd /usr/local/mysqlshell> useradd -r -s /sbin/nologin mysqlshell> mkdir -p /mydata/datashell> chown -R mysql.mysql /mydata/datashell> chmod o-rx /mydata/datashell> chown -R mysql.mysql /usr/local/mysqlshell> scripts/mysql_install_db --user=mysql --datadir=/mydata/datashell> cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnfshell> cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqldshell> chown -R root.root /usr/local/mysql# 修改my.cnf的datadir、socket、log和pid路径。shell> vim /etc/my.cnf [mysqld]datadir=/mydata/datasocket=/tmp/mysql.sock[mysqld_safe]log-error=/mydata/data/mysql.logpid-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.shsource /etc/profile.d/mysql.shchmod +x /etc/profile.d/mysql.shecho "MANPATH /usr/local/mysql/man" >>/etc/man.configecho "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.confldconfigln -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}/datashell> chown -R mysql.mysql /mydata/{3306,3307}/datashell> mysql_install_db --datadir=/mydata/3306/data --user=mysqlshell> mysql_install_db --datadir=/mydata/3307/data --user=mysqlshell> cp /etc/my.cnf /mydata/3306/my.cnfshell> cp /etc/my.cnf /mydata/3307/my.cnf
如果是设置mysql 5.7的多实例,则初始化时使用如下命令替换上面的mysql_install_db
。
shell> mysqld --initialize-insecure --datadir=/mydata/3306/data --user=mysqlshell> mysqld --initialize-insecure --datadir=/mydata/3307/data --user=mysql
分别修改两个配置文件。
#以下是3306实例的配置文件要修改的部分。shell> vim /mydata/3306/my.cnf[mysqld]port=3306datadir=/mydata/3306/datasocket=/mydata/3306/data/mysql.sockserver_id=1[mysqld_safe]log-error=/mydata/3306/data/mysqld.logpid-file=/mydata/3306/data/mysqld.pid#以下是3307实例的配置文件要修改部分。shell> vim /mydata/3307/my.cnf[mysqld]port=3307datadir=/mydata/3307/datasocket=/mydata/3307/data/mysql.sockserver_id=2[mysqld_safe]log-error=/mydata/3307/data/mysqld.logpid-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/networkbasedir=/usrexec="$basedir/bin/mysqld_safe"prog="mysqld"port=3306datadir="/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/mysqldSTARTTIMEOUT=120STOPTIMEOUT=60# Set in /etc/sysconfig/mysqld, will be passed to mysqld_safeMYSQLD_OPTS=[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$proglockfile=/var/lock/subsys/$progcase $socketfile in /*) adminsocket="$socketfile" ;; *) adminsocket="$datadir/$socketfile" ;;esacstart(){ [ -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 2esacexit $?
使用下面的命令管理两个实例:
service mysqld3306 {start|stop|status|restart}service mysqld3307 {start|stop|status|restart}
第一次启动可能会失败,也可能会警告和log相关的项,这是正常的,之后都会正常。
mysqld_safe
命令,因此使用mysqld
来启动mysql实例。[Unit]Description=MySQL ServerDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=mysqlGroup=mysqlType=forkingPIDFile=/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 rootPermissionsStartOnly=true# Start main serviceExecStart=/usr/sbin/mysqld --defaults-file=/mydata/3306/my.cnf --basedir=/usr --daemonize $MYSQLD_OPTS# Use this to switch malloc implementationEnvironmentFile=-/etc/sysconfig/mysql# Sets open_files_limitLimitNOFILE = 5000Restart=on-failureRestartPreventExitStatus=1PrivateTmp=false
然后重载下systemd服务管理脚本。
systemctl daemon-reload
之后就可以使用下面的命令管理两个实例:
systemctl {start|stop|status|restart} mysqld3306systemctl {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=mariadbbaseurl=http://yum.mariadb.org/10.2.6/centos/6.6/$basearch/#baseurl=http://yum.mariadb.org/10.2.6/centos/7.2/$basearch/enabled=1gpgcheck=0
联系客服