大概步骤如下:
- 关闭防火墙
- 配置sysctl.conf
- 检查操作系统是否安装了mysql
- 下载mysql源码包
- 添加用户和组
- 配置mysql环境便令
- 创建目录并授权
- 解压mysql
- 配置yum源,安装cmake
- 编译安装
- mysql参数配置
- 初始化mysql脚本
- 启动mysql
- 登录mysql
关闭防火墙
systemctl status firewalld 查看防火墙状态
systemctl stop firewalld 关闭防火墙
关闭selinux
vi /etc/selinux/config,将SELNUX=enconfig更改为:disabled
配置sysctl.conf
正式服务器,配置,个人使用就配置,主要是优化了mysql跟操作系统。
查看mysql是否安装
rpm -qa |grep mysql
删除mysql:rpm -e mysql.xxx / yum remove -y mysql
重点来了:
centos 7 因为mysql收费的原因,不在支持mysql,转而内部集成mariadb,那么首先要卸载mariabd
rpm -qa | grep mariadb
如果有依赖,就强制卸载即可
rpm -e --nodeps mariadb-libs-5.x
下载mysql源码包
在http://mysql.com上下载通用的linux源码
可以直接在服务器上安装wget命令,得到mysql源码下载目录,即可下载。
如:wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24.tar.gz
添加mysql组
查询mysql是否存在,id mysql
存在删除 userdel -r msql
groupadd mysql
useradd -d /home/mysql -g mysql -m mysql
修改密码:passwd mysql ...
设置环境变量
切换到mysql用户下:su - mysql
vi .bash_profile
在PATH=HOME/bib:后面添加mysql bin目录。
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/u01/my3306/mysql/bin
export PATH
/u01/my3306/mysql/bin是我的mysql bin目录
保存退出,执行source .bash_profile,加载bash_profile
创建目录并授权
mkdir -p /u01/my3306/mysql
mkdir -p /u01/my3306/mysql/data
mkdir -p /u01/my3306/mysql/tmp
mkdir -p /u01/my3306/mysql/log/iblog
mkdir -p /u01/my3306/mysql/log/binlog
mkdir -p /u01/my3306/mysql/run
授权:
chown -R mysql:mysql /u01/my3306
对/u01目录授予mysql:mysql组用户的权限
chmod -R 775 /u01/my3306
更改目录权限
解压mysql
tar -zxvf mysql-boost-5.7.21.tar.gz
安装cmake编译工具
yum install -y cmake gcc gcc-c++ ncurses-devel bison zlib libxml openssl
下载boost软件
boost历史版本
注意: mysql5.7.2x版本的必须指定1.5.9的boost,高版本不行
放到指定目录解压即可
进行cmake编译mysql源文件
在mysql源代码目录下执行
cmake \
-DCMAKE_INSTALL_PREFIX=/u01/my3306/mysql \
-DMYSQL_DATADIR=/u01/my3306/mysql/data \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/u01/my3306/mysql/run/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DENABLE_DOWNLOADS=1 \
-DWITH_BOOST=/u01/my3306/mysql/boost \
-DWITH_READLINE=on
通过阅读官方文件http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html,去除选项-DWITH_READLINE=1和-DWITH_SSL=YES
报错:
CMake Error at cmake/boost.cmake:81 (MESSAGE):
You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=
This CMake script will look for boost in . If it is not there,
it will download and unpack it (in that directory) for you.
If you are inside a firewall, you may need to use an http proxy:
export http_proxy=http://example.com:80
Call Stack (most recent call first):
cmake/boost.cmake:238 (COULD_NOT_FIND_BOOST)
CMakeLists.txt:507 (INCLUDE)
-- Configuring incomplete, errors occurred!
See also "/u01/my3306/mysql-5.7.21/CMakeFiles/CMakeOutput.log".
See also "/u01/my3306/mysql-5.7.21/CMakeFiles/CMakeError.log".
需要添加boost
1. 下载boost
2. 解压到mysql的安装目录下,新建一个boost目录
3. 在cmake参数中添加
-DWITH_BOOST=/u01/my3306/mysql/boost \
boost下载:https://www.boost.org/users/download/
对应1.5.9版本
进行编译安装
make & make install
make 进行编译,这里时间比较久
make install 进行安装
mysql参数my.cnf配置
[client]
port=3306
socket=/u01/my3306/mysql/run/mysql.sock
[mysql]
socket=/u01/my3306/mysql/run/mysql.sock
[mysqld]
autocommit=1
general_log=off
explicit_defaults_for_timestamp=true
# system
basedir=/u01/my3306/mysql
datadir=/u01/my3306/mysql/data/
open_files_limit=10240
# 控制mysql接收数据包的大小,主从应该保证一致
max_allowed_packet=32m
# 控制允许的最大连接数
max_connections=2000
# 最大用户连接不宜过大
max_user_connections=200
wait_timeout=100
pid_file=/u01/my3306/mysql/run/mysqld.pid
port=3306
server_id=101
# 禁用DNS查找
skip_name_resolve=ON
socket=/u01/my3306/mysql/run/mysql.sock
tmpdir=/u01/my3306/mysql/tmp
# 默认值5000
open_files_limit=5000
# 设置 LOAD DATA and SELECT ... INTO OUTFILE 导出限制
secure_file_priv=''
# bin log
log_bin=/u01/my3306/mysql/log/binlog/binlog
binlog_cache_size=32768
binlog_format=row
# 保留bin-log保存的日期
expire_logs_days=3
log_slave_updates=ON
max_binlog_size=512M
log-bin-index=binlog.index
# 控制mysql如何想磁盘刷新binlog,默认为0,建议设置为1,
sync_binlog=1
# logging
log_error=/u01/my3306/mysql/log/mysql_error.err
slow_query_log_file=/u01/my3306/mysql/log/slow.log
log_queries_not_using_indexes=0
slow_query_log=1
log_slave_updates=ON
log_slow_admin_statements=1
long_query_time=1
# relay
relay_log=/u01/my3306/mysql/log/relaylog
relay_log_index=/u01/my3306/mysql/log/relay.index
relay_log_info_file=/u01/my3306/mysql/log/relay-log.info
# slave
slave_load_tmpdir=/u01/my3306/mysql/tmp
slave_skip_errors=OFF
# 禁止非super权限的用户写权限,一定要在从库启用
# read_only=1
# innodb
innodb_data_home_dir=/u01/my3306/mysql/log/iblog
innodb_log_group_home_dir=/u01/my3306/mysql/log/iblog
innodb_adaptive_flushing=ON
innodb_adaptive_hash_index=ON
innodb_autoinc_lock_mode=1
innodb_buffer_pool_instances=8
# default
innodb_change_buffering=inserts
innodb_buffer_pool_size=256M
innodb_data_file_path=ibdata1:32M;ibdata2:16M:autoextend
# 控制双写缓冲,避免页损坏
innodb_doublewrite=1
# 为每一张表建立一个单独的表空间,不使用系统表空间
innodb_file_per_table=1
# 系统提交事务的方式: 2:每次事物提交,执行log数据写入catch,每秒执行一次flush log到磁盘
innodb_flush_log_at_trx_commit=2
# 文件交换的方式,linux服务器设置为O_DIRECT即可
innodb_flush_method=O_DIRECT
innodb_io_capacity=1000
innodb_lock_wait_timeout=10
innodb_log_buffer_size=20M
innodb_log_file_size=100M
innodb_log_files_in_group=4
innodb_max_dirty_pages_pct=60
# 不能大于open_file_limit
innodb_open_files=4000
innodb_purge_threads=1
innodb_read_io_threads=4
innodb_stats_on_metadata=OFF
innodb_support_xa=ON
innodb_use_native_aio=OFF
innodb_write_io_threads=10
[mysqldump]
quick
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
basedir=/u01/my3306/mysql
datadir=/u01/my3306/mysql/data
pid_file=/u01/my3306/mysql/run/mysqld.pid
tmpdir=/u01/my3306/mysql/tmp
进行初始化数据库和密码
./mysqld --initialize --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data --default-files=/u01/my3306/mysql/my.cnf
注意:所有的报错信息都将会在配置的mysql-err.err日志中体现,如果没有配置这个日志,将会在控制台直接输出。
注意:此条语句执行时容易报错,成功至少要满足以下几个条件
1. /u01/my3306/mysql/data目录存在并且一定要为空目录,否则报错;
2. 如果本机已经存在了其余的mysql,请确实/etc/my.cnf文件不存在,否则会按照/etc/my.cnf中的设置进行初始化,datadir会读取另一个mysql实例的路径,从而导致报错。遇到此情况,可以先将已经存在的mysql实例停止,然后将/etc/my.cnf文件剪切到此实例对应的datadir目录中,再启动此实例,然后重新执行初始化命令;
报错:
2018-03-21T03:53:19.536884Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-03-21T03:53:19.539255Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2018-03-21T03:53:19.539297Z 0 [ERROR] Aborting
- 提示timestamp有警告,需要禁用某些非标准的行为。
- data数据库目录已经存在文件,需要先删除该目录下的所有文件。
官网:详情请查看
注意:my.cnf的权限设置为644,chmod 644 my.cnf 用户设置为mysql 这是mysql的安全机制。
[root@lnlr bin]# ./mysqld --initialize --defaults-file=/u01/my3306/mysql/my.cnf --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data
2018-03-21T03:42:15.884264Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-03-21T03:42:16.945180Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-03-21T03:42:17.242546Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-03-21T03:42:18.471497Z 0 [ERROR] unknown variable 'defaults-file=/u01/my3306/mysql/my.cnf'
2018-03-21T03:42:18.471564Z 0 [ERROR] Aborting
提示找不到--defaults-file=/u01/my3306/mysql/my.cnf这个变量
原因:
mysql寻找my.cnf的顺序
/etc/my.cnf
/etc/mysql/my.cnf
$mysql_home/my.cnf
~/.my.cnf
解决办法:
将/etc/my.cnf进行删除,然后把启动命令的顺序进行调整。
将--defaults-file调整到--initialize前面即可
正确命令: ./mysqld --defaults-file=/u01/my3306/mysql/my.cnf --initialize --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data
正确后的输出:
2018-03-21T03:59:48.606609Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-03-21T03:59:50.068792Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-03-21T03:59:50.164896Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-03-21T03:59:50.226389Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4d9ac927-2cbc-11e8-932c-000c29ca223e.
2018-03-21T03:59:50.227839Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-03-21T03:59:50.532475Z 0 [Warning] CA certificate ca.pem is self signed.
2018-03-21T03:59:50.684543Z 1 [Note] A temporary password is generated for root@localhost: 6GttX,)_-paX
最后一行是密码
初始化正确命令,无密码
./mysqld --defaults-file=/u01/my3306/mysql/my.cnf --initialize-insecure --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data
参数说明:
--initialize 是使用mysqld初始化数据库,并且生成数据库密码
--initialize-insecure 同上,但是不初始化数据库密码
无论平台如何,都 --initialize用于“ 默认安全 ”安装(即包括生成随机初始`root`密码)。在这种情况下,密码被标记为过期,
您将需要选择一个新密码。使用该 --initialize-insecure选项,不会 `root`生成密码; 假设您在将服务器投入生产之前将及时为帐户分配密码。
--defaults-file 指定使用my.cnf配置文件
--basedir数据库的根目录
--datadir数据库数据文件目录
安全启动mysql数据库
启动命令:
./mysqld_safe --user=mysql --defaults-file=/u01/my3306/mysql/my.cnf &
ctrl+c结束
ps -ef | grep mysql查看mysql进程
[root@lnlr bin]# ps -ef | grep mysql
root 8701 25911 0 13:24 pts/0 00:00:00 /bin/sh ./mysqld_safe --defaults-file=/u01/my3306/mysql/my.cnf
mysql 8761 8701 0 13:24 pts/0 00:00:00 /u01/my3306/mysql/bin/mysqld --defaults-file=/u01/my3306/mysql/my.cnf --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data --plugin-dir=/u01/my3306/mysql/lib/plugin --user=mysql --log-error=lnlr.err --pid-file=lnlr.pid
root 9218 25911 0 13:29 pts/0 00:00:00 ./mysql -uroot -p
root 9250 7572 0 13:29 pts/1 00:00:00 grep --color=auto mysql
启动mysql数据库:
1. 使用mysqld 启动
2. 使用mysqld_safe安全启动
却别:
安全启动的好处为在误杀了mysql进程的时候,mysqld_safe守护进程将会自动的把mysqld进程启动起来。
小板凳: 我使用mysqld_safe启动的时候,拷贝命令将会报找不到--defaults-file,手动敲入就可以。很奇怪。
登录mysql,并修改密码
./mysql -uroot -p
输入密码进行登录
修改密码:
alter user 'root'@'localhost' identified by 'root';
处理远程登录
通过以上步骤,在localhost可以使用mysql,但是想要远程访问,将会报错。
ERROR 1130: Host '192.168.21.249' is not allowed to connect to this MySQL
原因:防火墙或该用户只能localhost访问。
解决办法:
1. 将mysql数据库下user表中的host字段更改为%即可
use mysql; update user set host = '%' where user = 'root'; quit;
重新启动mysql数据库即可,三条命令一次性执行;还可以将更改密码同时放入。
2. 可以利用授予权限
没尝试
后续设置
1. 将/u01/my3306/mysql/my.cnf拷贝到/etc目录下,mysql默认先寻找该目录,这样免得每次启动都需要带上--defaults-file路径
cp /u01/my3306/mysql/my.cnf /etc
2. 将安装目录下的/u01/my3306/mysql/support-files/mysql.server拷贝到/etc/init.d目录下
cp /u01/my3306/mysql/support-files/mysql.server /etc/init.d
3. 添加mysql.server到服务中
chkconfig --add mysql.server
4. 测试使用systemctl 启动mysql
systemctl start mysql.server
5. 查看是否启动成功
ps -ef | grep mysql
有mysql服务则启动成功
6. 添加到linux服务器开机自启动
systemctl enable mysql.server