MySQL 系列(一)安装
以 Centos7 下安装 MySQL 5.6 为例。
一、环境准备
(1) 下载
下载地址: https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
(2) 安装依赖
yum -y install perl perl-devel autoconf libaio
(3) 卸载已安装的 MySQL
yum list installed | grep mysql # 查询已安装的 MySQL
yum -y remove mysql-libs.x86_64 # 卸载
(4) 创建 mysql 用户
userdel mysql # 删除 mysql 用户
groupdel mysql # 删除 mysql 用户组
groupadd mysql # 创建 mysql 用户组
useradd -g mysql mysql # 创建 mysql 用户并加入 mysql 用户组
echo mysql | passwd --stdin mysql # mysq 添加密码
(5) sudo 免密码操作
visudo
%wheel ALL=(ALL) NOPASSWD: ALL
# 用户加入 wheel 组
gpasswd -a mysql wheel
二、MySQL 安装
(1) 切换到 mysql 帐号
# 切换到 mysql 帐号
su - mysql
(2) 将下载的二进制安装包解压后放到 /usr/local/mysql 目录下
sudo tar -zxvf mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz
sudo mv mysql-5.6.38-linux-glibc2.12-x86_64 /usr/local/mysql
(3) 环境变量
sudo vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
source /etc/profile # 立即生效
(4) 在 etc 下新建配置文件 my.cnf
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock
[mysqld]
user=mysql
skip-name-resolve
#设置3306端口
port = 3306
socket=/var/lib/mysql/mysql.sock
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
说明:
-
使用
mysqld --help -vv | grep my.cnf
查看 mysql 的配置文件读取顺序。[root@binarylei mysql]# mysql --help --vv | grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf /usr/local/mysql/my.cnf ~/.my.cnf
-
后读取的
my.cnf
中的配置,如果有相同项,会覆盖之前的配置。 -
使用
--defaults-files
可指定配置文件。
(5) 创建 /var/lib/mysql 并将用户修改为 mysql
# my.cnf 文件中配制的 socket 目录
sudo mkdir /var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql
(6) 初始化 MySQL
# 一定要在 mysql 的安装目录下
./scripts/mysql_install_db --user=mysql
到此 MySQL 安装完毕!下面介绍 MySQL 作为服务启动方式。
三、MySQL 启动
1、添加mysql服务开机自启动
sudo cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld # 复制启动脚本到资源目录
sudo chmod +x /etc/rc.d/init.d/mysqld # 增加 mysqld 服务控制脚本执行权限
sudo chkconfig --add mysqld # 将 mysqld 服务加入到系统服务
sudo chkconfig --list mysqld # 检查 mysqld 服务是否已经生效
命令输出类似下面的结果:
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
表明 mysqld 服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用 service 命令控制 mysql 的启动和停止。
2、启动msql
service mysqld start # 启动 msql
service mysqld stop # 停止msql
MySQL 启动后后有两个进程,其中 mysqld_safe 为守护进程,当 MySQL 异常关闭时会重新拉起 mysqld 进程。
root 22513 1 0 Jan04 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/binarylei.pid
mysql 22824 22513 0 Jan04 ? 00:00:45 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=binarylei.err --pid-file=/usr/local/mysql/data/binarylei.pid --socket=/var/lib/mysql/mysql.sock
四、权限控制
(1) 设置 mysql 帐号和密码
以 root 账户登陆 mysql,默认是没有密码
UPDATE mysql.user SET password=password('123456') WHERE user='root' AND host='localhost';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
(2) 去除匿名用户
delete from mysql.user where User=''; # 删除匿名用户,使用root用户登录数据库
flush privileges;
五、MySQL 升级
以 MySQL5.6 -> 5.7 为例。如果不是跨很大的版本,通常不用 mysqldump 备份数据,直接使用 mysql_upgrade 进行升级。mysql_upgrade 建议使用 -s 参数,只升级系统表,不用升级数据表,因为如果数据量很大,会导致升级非常慢。
注意: 升级前后 my.cnf
中的配置项 datadir
参数相同。
# 更新 MySQL 软件包,直接将 mysql 软链接由 mysql-5.6 指向 mysql-5.7
service mysqld stop
unlink /usr/local/mysql
ln -sv /usr/local/lib/mysql-5.7 /usr/local/mysql
service mysqld start
# -s表示只升级系统表,通常情况下不用升级数据表 --force表示已经升级了
mysql_upgrade -s --force
mysql_upgrade -h
-f, --force Force execution of mysqlcheck even if mysql_upgrade has
already been executed for the current version of MySQL.
-s, --upgrade-system-tables
Only upgrade the system tables do not try to upgrade the data.
六、错误处理
MySQL 日志存储目录: my.cnf 中配制了 datadir 目录,如 datadir=/usr/local/mysql/data,在 datadir 目录下会新建一个 “主机名.err” 的文件
(1) 问题 1:Can't connect to local MySQL server through socket '/tmp/mysql.sock'
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
解决方法:
打开 /etc/my.cnf,看看里面配置的 socket 位置是什么目录,如 socket=/var/lib/mysql/mysql.sock
MySQL 服务端启动时报错,则很可能是 mysql 用户没有操作 /var/lib/mysql 的权限。一般将 /var/lib/mysql 用户修改为 mysql 用户可以解决问题。
chown -R mysql:mysql /var/lib/mysql
MySQL 客户端连接时报错,则很可能是 socket 路径和 “/tmp/mysql.sock” 不一致。建立一个软连接:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
七、附录
附录1:MySQL 5.6.X 安装:
shell> yum install libaio # Debain系用户:apt-get install libaio1
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server
附录2:MySQL 5.7.X 安装
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> mkdir mysql-files
shell> chmod 770 mysql-files
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> bin/mysqld --initialize --user=mysql #该步骤中会产生零时
#root@localhost密码
#需要自己记录下来
shell> bin/mysql_ssl_rsa_setup
shell> chown -R root .
shell> chown -R mysql data mysql-files
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server
附录3:my.ini 生产环境参考配置
[client]
user=root
password=12346
[mysqld]
########basic settings########
server-id = 11
port = 3306
user = mysql
bind_address = 10.166.224.32 #根据实际情况修改
autocommit = 0 #5.6.X安装时,需要注释掉,安装完成后再打开
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /data/mysql_data #根据实际情况修改,建议和程序分离存放
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
tmpdir = /tmp
max_allowed_packet = 16777216
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432
########log settings########
log_error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
long_query_time = 2
min_examined_row_limit = 100
########replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
innodb_page_size = 8192
innodb_buffer_pool_size = 6G #根据实际情况修改
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_log_group_home_dir = /redolog/ #根据实际情况修改
innodb_undo_directory = /undolog/ #根据实际情况修改
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 4G #根据实际情况修改
innodb_log_buffer_size = 16777216
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864
########semi sync replication settings########
plugin_dir=/usr/local/mysql/lib/plugin #根据实际情况修改
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on
几个重要的参数配置和说明:
-
innodb_log_file_size = 4G
:做实验可以更改的小点,线上环境推荐用 4G,以前 5.5 和 5.1 等版本之所以官方给的值很小,是因为太大后有 bug,现在 bug 已经修复。 -
innodb_undo_logs = 128
和innodb_undo_tablespaces = 3
建议在安装之前就确定好该值,后续修改比较麻烦。 -
[mysqld]
,[mysqld-5.7]
这种 tag 表明了下面的配置在什么版本下才生效,[mysqld]
下均生效。 -
autocommit
,这个参数在 5.5.x 以后才有,安装 5.6.x 的时候要注意先把该参数注释掉,等安装完成后,再行打开, 5.7.X 无需预先注释。 -
datadir
,innodb_log_group_home_dir
,innodb_undo_directory
一定要注意他的权限是mysql:mysql
每天用心记录一点点。内容也许不重要,但习惯很重要!