原创 2016年02月16日 13:04:01mysql
目录 1linux
1. 安装 1sql
3. mysqld_safe和mysql.server 4socket
4. 主主同步配置 4ide
4.2. my.cnf 5.net
4.3. 配置项说明 5命令行
这里安装的是最新的MySQL 5.7.10(5.7.十二、5.7.13(后续更新版本可能相似)有些区别,安装过程当中遇到错误可搜索下本文,也许能够找到解决办法),下载网址为:http://dev.mysql.com/downloads/mysql/。
本文选择是的“Linux - Generic”下的“Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive”,它的二进制安装包名为mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz。
将MySQL二进制安装包解压后,可看到名为INSTALL-BINARY(注意5.7.12版本INSTALL-BIARY文件位于docs目录下,而不是根目录)的文件,该文件有说明如何安装MySQL,本文基本参照它进行的。
因为官方提供的二进制安装包,编译的时候指定的“--prefix”为“/usr/local/mysql”,因此强烈建议将mysql安装在/usr/local目录下,不然安装过程会容易遇到问题。但同时建议将数据目录指定为一个足够大的分区下的目录。
固然,data目录也能够为软连接方式到足够大的分区目录,而且推荐使用软连接方式。不然在使用mysql命令时,常常须要指定参数“--datadir”,好比mysqld、mysqld_safe和mysql_ssl_rsa_setup等都须要指定“--datadir”。
若是不是安装在/usr/local/mysql,则须要为mysqld指定--basedir、--character-sets-dir、--language、--lc-messages-dir、--plugin-dir等众多参数值。
若是不能root用户安装,则还须要为mysqld指定--slow-query-log-file、--socket、--pid-file、--plugin-dir和--general-log-file等参数值。
这些参数的默认值,均可以经过执行MySQL的“bin/mysqld --verbose --help”查看到。
# MySQL安装目录为/usr/local/mysql,数据目录实际为/data/mysql/data # 注意需以root用户安装MySQL,若是不能root用户安装,容易遇到安装麻烦 # 并请注意5.7.6以前的版本安装略有不一样!
# 新建mysql用户组 groupadd mysql # 新建mysql用户,并设置为不能做为linux登陆用户 useradd -r -g mysql -s /bin/false mysql
# 进入到mysql安装目录 cd /usr/local # 解压二进制安装包 tar xzf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz # 创建易记的、与版本无关的短连接 ln -s mysql-5.7.10-linux-glibc2.5-x86_64 mysql
# 进入到mysql目录 cd mysql
# 建立数据目录 mkdir -p /data/mysql/data # 创建数据目录软连接,让指向/usr/local/mysql/data指向/data/mysql/data # mysql-5.7.12默认的数据目录为/var/lib/mysql, # 而不是默认的/usr/local/mysql/data,请安装的时候注意, # 但mysql-5.7.13却又是/usr/local/mysql/data ln -s /data/mysql/data /usr/local/mysql/data # 对于mysql-5.7.12(不包含mysql-5.7.13),应当以下: #ln -s /data/mysql/data /var/lib/mysql
# 建立mysqld_safe日志文件mariadb.log目录(mysql-5.7.12要求,mysql-5.7.10不须要) # mysqld的错误日志文件默认位于data目录下,日志文件名为机器名,后缀为“.err”, # 若是mysqld启动不了,能够检查这两个日志文件,以找到解决办法。 mkdir /var/log/mariadb
# 建立mysqld的pid文件mariadb.pid目录(mysql-5.7.12要求,mysql-5.7.10不须要) mkdir /var/run/mariadb
# 设置目录权限 chmod 770 /data/mysql/data chown -R mysql /data/mysql/data chgrp -R mysql /data/mysql/data chown -R mysql . chgrp -R mysql .
# 下列4条mysql-5.7.12要求,mysql-5.7.10不须要 chmod 770 /var/log/mariadb chmod 770 /var/run/mariadb chown -R mysql /var/log/mariadb chgrp -R mysql /var/run/mariadb
# 初始化(成功执行完mysqld后,会提供一个临时的root密码,请务必记住) # 另外须要注意临时密码会过时,因此须要尽可能修改root密码 # 但若是指定参数–initial-insecure,则账号root@localhost的密码为空 bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp
# 安装和配置SSL bin/mysql_ssl_rsa_setup
# 重置目录权限 chown -R root . chown -R mysql /data/mysql/data
# 修改/etc/profile中的环境变量PATH # 将MySQL的bin目录加入到PATH的最前面 export PATH=/usr/local/mysql/bin:$PATH
# 启动mysql,请不要使用“bin/mysqld_safe --user=mysql &”来启动MySQL # 缘由是5.7.12和5.7.10等版本的参数值不一致。 # 使用“bin/mysqld_safe --user=mysql &”启动MySQL,将不能使用5.7.12版本mysql.server来中止MySQL,故推荐使用mysql.server来启动MySQL,由mysql.server间接调用mysqld support-files/mysql.server start # 若是mysql.server不能正常中止MySQL,请日后查看解决办法
# 查看端口是否已起来(不修改配置和不指定参数--port,默认端口号为3306) netstat -lpnt|grep 3306
# 中止MySQL support-files/mysql.server stop
# 设置mysql随着系统自启动 cp support-files/mysql.server /etc/init.d/mysql.server |
以上使用的都是MySQL默认配置,若是须要定制化,能够经过修改文件my.cnf来达成。MySQL 5.7.10不带my.cnf,只有个support-files/my-default.cnf。
经过执行命令“support-files/my-default.cnf”,能够了解到MySQL搜索my.cnf的顺序依次为:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf,这样能够复制一份my-default.cnf,而后再修改,如:cp support-files/my-default.cnf /etc/my.cnf。
因为上一步生成的是root临时密码,所以须要修改,以防过时不能使用。使用临时密码进入MySQL Cli,以设置正式密码(注意保持mysql要和mysqld版本相同,不然可能会遇到“Your password has expired”错误,简便的作法是修改环境变量PATH,让新版的mysql位于老版本mysql的搜索路径以前,好比export PATH=/usr/local/mysql/bin:$PATH):
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
并建议使用单引号括起密码,使用双引号有转义问题!示例:
mysql -uroot -h127.0.0.1 -p'8d#uhJdf(:Y<',其中'8d#uhJdf(:Y<'为临时密码。
mysql.server会调用mysqld_safe,二者均可以用来启动MySQL,但中止和重启只有mysql.server具有。Mysql.server经过读取pid文件来中止MySQL,pid文件默认位于data目录,但能够经过命令行参数pid-file来修改。
能够为mysqld_safe指定参数--user,来肯定运行mysqld的运行用户,若是不指定的话,默认为mysql(由mysqld_safe文件中的变量user指定)。
以root执行msyqld_safe或mysql.server启动mysqld时,mysqld会自动切换到--user指定的用户,如mysql。经过ps aux|grep mysqld,能够看到mysqld_safe运行在用户root下,而mysqld运行在用户mysql下。
若是使用mysql.server遇到错误:ERROR! MySQL server PID file could not be found!,则是由于mysqld的--pid-file参数和mysql.server的不一致。
执行ps aux|grep mysqld便可查看到mysqld的--pid-file参数值,或执行“mysqld --verbose --help”也能够查看到mysqld的--pid-file参数值:bin/mysqld --verbose --help|grep pid-file。
简单的解决办法是修改mysql.server文件,搜索变量mysqld_pid_file_path(有些版本变量名为server_pid_file),并设置变量mysqld_pid_file_path的值和mysqld的--pid-file参数值相同便可。
对于mysql-5.7.13,mysql.server中的mysqld_pid_file_path默认值为$datadir/`hostname`.pid,而mysqld的--pid-file参数值为/var/lib/mysql/`hostname`.pid,二者不一致,将文件中的变量值修改为一致后即正常工做,如:mysqld_pid_file_path=/var/lib/mysql/`hostname`.pid。
若是启动不成功,又找不到出错日志信息,则能够考虑修改mysql.server,将:
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
一行的重定向先注释掉,如:
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args #>/dev/null 2>&1 &
以即可以在屏幕上观察到出错缘由。
启动MySQL,而后进入MySQL CLi,执行如下命令建立用于同步的用户:
grant replication slave,file on *.* to 'user'@'peer' identified by 'password'; flush privileges; |
其中user为用于同步的用户名,peer为另外一主的IP地址,password为user的MySQL密码,这3个的值需根据实际进行修改。
注意,两主机器都须要建立同步用户。并确保peer为另外一主的IP地址,其它user和password两主建议保持相同,示例(假设两主IP分别为192.168.1.1和192.168.1.2):
Ø 192.168.1.1上执行:
grant replication slave,file on *.* to 'replication'@'192.168.1.2' identified by '123456'; flush privileges; |
Ø 192.168.1.2上执行:
grant replication slave,file on *.* to 'replication'@'192.168.1.1' identified by '123456'; flush privileges; |
修改/etc/my.cnf,实现主主配置。
若是不存在/etc/my.cnf,则复制support-files/my-default.cnf生成my.cnf,两台机器的my.cnf分别配置为(不难看到,只有server_id和auto_increment_increment两项不一样):
机器A |
机器B |
server-id=1 user=mysql log-bin=mysql-bin log-slave-updates slave-skip-errors=all sync_binlog=1 auto_increment_increment=1 auto_increment_offset=1 |
server-id=2 user=mysql log-bin=mysql-bin log-slave-updates slave-skip-errors=all sync_binlog=1 auto_increment_increment=2 auto_increment_offset=1 |
配置项 |
配置项说明 |
server-id |
不能相同!惟一标识号,值位于1~2^32-1之间 |
user |
这个能够不指定,则使用mysqld_safe指定的用户,或者mysqld_safe默认的用户mysql |
log-bin |
启用二进制日志文件 |
log-slave-updates |
配置从库上的更新操做是否写二进制文件,须要和log-bin一块儿使用 |
slave-skip-errors |
值为all表示让从库跳过全部错误(但不能跳过全部DDL所引发的主从错误),也能够只跳过指定的错误,如:--slave-skip-errors=1062,1053;也能够配置只跳过DDL错误,如:--slave-skip-errors=ddl_exist_errors,这等同于: --slave-skip-errors=1007,1008,1050,1051,1054,1060,1061,1068,1094,1146 |
sync_binlog |
值为1表示主机每次提交事务的时候把二进制日志的内容同步到磁盘上 |
auto_increment_increment auto_increment_offset |
和auto_increment_offset一块儿用于主主同步,用来错开自增,防止键值冲突,因此auto_increment_increment和auto_increment_offset二者,至少要有一项值不一样。 |
上述配置会致使同步全部的数据库,借助下列配置项也能够选择性的同步或不一样步:
配置项 |
配置项说明 |
binlog-do-db=test1 binlog-do-db=test2 |
表示只同步数据库test1和test2,若是还想同步test3,只须要新增一行:binlog-do-db=test3便可 |
binlog-ignore-db=db1 binlog-ignore-db=db2 |
表示不一样步数据库db1和db2,若是还有db3不想同步,新增一行:binlog-ignore-db=db3便可 |
相关配置项(对于主从同步,只须要在从上配置):replicate-do-db、replicate-ignore-db、replicate_wild_do_table和replicate_wild_ignore_table。
分别重启MySQL,进入MySQL Cli,执行命令“show master status\G”,记住“File”和“Position”的值,如:
mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000004 Position: 682 Binlog_Do_DB: test Binlog_Ignore_DB: mysql Executed_Gtid_Set: 1 row in set (0.00 sec) |
设置同步关系(两个主都须要设置):
stop slave; change master to master_host='peer',master_user='user',master_password='password',master_log_file='mysql-bin.000004', master_log_pos=682; |
若是不先执行“stop slave;”,则可能遇到以下错误:
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first. |
这里,peer、user和password三者的取值为“建立同步用户”时指定的值。设置示例:
change master to master_host='192.168.1.2',master_user='replication',master_password='123456',master_log_file='mysql-bin.000004', master_log_pos=682; |
因为前面一步调用“stop slave;”,中止了复制。在完成后,需再启动复制:
start slave; |
执行命令“show slave status\G;”查看复制状态,若是出现“Slave_IO_Running: Yes”和“Slave_SQL_Running: Yes”,则表示状态正常。
进一步,能够分别建立一个表,如:create table test1 (a int)和create table test2 (b int)。再分别使用show tables查看是否同步过去。
1) ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.
遇到这个问题,多是由于客户端mysql和服务端版本不一致,好比mysql-5.5.41链接5.7.12。
2) TIMESTAMP with implicit DEFAULT value is deprecated
执行MySQL的“bin/mysqld --initialize --user=mysql”时报的错误。
缘由是从MySQL 5.6版本开始,timestamp的默认值已被标为deprecated,即若是类型为timestamp的字段,若是没有明确声明默认值为NULL,则默认为NOT NULL。若是设置timestamp字段为NULL,则自动存储当前的timestamp。
3) Can't find error-message file '/usr/local/mysql/share/errmsg.sys'
执行MySQL的“bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp”时报的错误。
这多是由于以前有执行过,致使data目录不为空,经过“bin/mysqld --verbose --help|grep datadir”能够查看到默认的数据目录为/var/lib/mysql/。须要保证/var/lib/mysql/目录为空。或者经过指定参数--datadir改变数据目录,如“bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp --datadir=/data/mysql/data”。
4) Can't find error-message file '/usr/local/mysql/share/errmsg.sys'
对于错误:
Can't find error-message file '/usr/local/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
从官网下载的MySQL默认安装目录为/usr/local/mysql,若是实际为其它目录,则建议经过参数--basedir指定,不然会遇到很多安装问题。经过执行“bin/mysqld --verbose --help|grep basedir”便可看到“--basedir”的默认值为/usr/local/mysql/。
5) Can't connect to local MySQL server through socket
使用mysql试图进入MySQL Cli时,遇到错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
多是由于客户端的版本和服务端的版本不一致,若是是这样,一般不存在/var/lib/mysql/mysql.sock。能够修改环境变量PATH来解决,让新安装的MySQL的bin目录位于PATH前头,如:
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
export MANPATH=$MYSQL_HOME/man:$MANPATH
6) ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread;run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
在设置同步关系时,没有先中止slaves线程。解决办法为在设置同步关系以前,先执行下“stop slave”,以中止slave线程。
7) ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
执行mysql时报的错,是因为服务端mysqld和客户端mysql二者的mysql.sock文件位置不一样。
解决办法:
使用“ps aux|grep mysqld”或“cat "/proc/`pidof mysqld`/cmdline"”查看mysqld参数“--socket”的值,好比多是“/var/lib/mysql/mysql.sock”。
显然不是mysql要找的“/tmp/mysql.sock”,指定下mysql的参数“-S”便可解决问题,如:mysql -S/var/lib/mysql/mysql.sock -uroot -p(坑爹的MySQL-5.7.12,默认参数各类不一致)。
8) mysqld: Table 'mysql.plugin' doesn't exist
2016-05-18T03:33:56.235882Z 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
可使用“bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp”重作下初始化,便可解决。
9) 2016-05-18T03:41:02.970764Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
办法同上。
10) 2016-05-18T03:44:42.731483Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
执行“bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp”时报的错误,解决办法是清空data目录后再执行。