CentOS7上源码编译安装MySQL5.7
目录
注意
注意 cmake 选项应该再优化一下、 https://blog.csdn.net/kangshuo2471781030/article/details/79294503
有空要多看一下my.cnf 的各个参数 MySql5.7 配置文件 my.cnf 设置
pre
注意 cmake 选项应该再优化一下、 https://blog.csdn.net/kangshuo2471781030/article/details/79294503 MySQL currently requires boost_1_59_0 把原码包mysql-5.7.18.tar.gz上传到SOURCES目录下,并在SPECS目录下添加配置好的mysql.spec文件: 由于在Mysql5.6后都要依赖boost_1_59_0.tar.gz包,所以这里我直接解压到BUILD目录下,不然检测不到; tar xf boost_1_59_0.tar.gz -C rpmbuild/BUILD/ -DWITH_MYISAM_STORAGE_ENGINE=ON -DENABLED_LOCAL_INFILE:BOOL=ON -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON -DEXTRA_CHARSETS=all 我没有 rpmdevtools pcre-devel gcc make ncurses-devel
mysql5.7 源码编译安装
安装依赖包
yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bison bison-devel rpmdevtools pcre-devel make
下载相应源码包
wget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18.tar.gz
创建mysql用户、用户组及目录
if ! id mysql > /dev/null 2>&1;then useradd -M -s /sbin/nologin mysql mkdir -p /data/apps/mysql/data/ mkdir -p /data/apps/mysql/binlog/ #mkdir -p /data/apps/mysql/logs/ mkdir -p /data/logs/mysql touch /data/logs/mysql/mysqld-error.log chown -R mysql:mysql /data/logs/mysql chown -R mysql:mysql /data/apps/mysql
预编译及安装
tar zxvf boost_1_59_0.tar.gz -C /root/mysql #将文件解压至/root/mysql目录下 tar zxvf mysql-5.7.23.tar.gz && cd mysql-5.7.23 file ../boost_1_59_0 cmake . \ -DSYSCONFDIR:PATH=/data/apps/mysql \ -DCMAKE_INSTALL_PREFIX:PATH=/data/apps/mysql \ -DCMAKE_BUILD_TYPE:STRING=Release \ -DENABLE_PROFILING:BOOL=ON \ -DWITH_DEBUG:BOOL=OFF \ -DWITH_VALGRIND:BOOL=OFF \ -DENABLE_DEBUG_SYNC:BOOL=OFF \ -DWITH_EXTRA_CHARSETS:STRING=all \ -DWITH_SSL:STRING=bundled \ -DWITH_UNIT_TESTS:BOOL=OFF \ -DWITH_ZLIB:STRING=bundled \ -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON \ -DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON \ -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DENABLED_LOCAL_INFILE:BOOL=ON \ -DINSTALL_LAYOUT:STRING=STANDALONE \ -DCOMMUNITY_BUILD:BOOL=ON \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITHOUT_NDBCLUSTER_STORAGE_ENGINE=1 \ -DENABLED_PROFILING=1 \ -DINNODB_PAGE_ATOMIC_REF_COUNT=1 \ -DMYSQL_DATADIR=/data/apps/mysql/data \ -DWITH_BOOST=../boost_1_59_0 \ -DSYSCONFDIR=/etc \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=ON \ -DWITH_READLINE=1 \ -DWITH_SYSTEMD=1 \ -DMYSQL_TCP_PORT=3306; warring CMake Warning: Manually-specified variables were not used by the project: COMMUNITY_BUILD ENABLE_DEBUG_SYNC ENABLE_PROFILING INNODB_PAGE_ATOMIC_REF_COUNT WITH_MEMORY_STORAGE_ENGINE WITH_READLINE #编译安装 make -j `grep processor /proc/cpuinfo | wc -l` && make install #安装完成后清理一下零时文件 make clean
设置权限并初始化 MySQL 系统授权表
cd /data/apps/mysql/ useradd -M -s /sbin/nologin %{MYSQL_USER} mkdir -p /data/apps/mysql/data/ mkdir -p /data/apps/mysql/binlog/ #mkdir -p /data/apps/mysql/logs/ mkdir -p /data/logs/mysql touch /data/logs/mysql/mysqld-error.log chown -R mysql:mysql /data/logs/mysql chown -R mysql:mysql /data/apps/mysql cd /data/apps/mysql/ chown -R mysql:mysql . [root@szlinux02 mysql]# mkdir temp [root@szlinux02 mysql]# chmod 777 ./temp [root@szlinux02 mysql]# cd /data/mysql [root@szlinux02 mysql]# chown -R mysql:mysql .
初始化系统数据库
MySQL 5.7.6之前的版本执行这个脚本初始化系统数据库
./bin/mysql_install_db --user=mysql --basedir=/data/apps/mysql --datadir=/data/mysql
5.7.6之后版本初始系统数据库脚本
/data/apps/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/apps/mysql/ --datadir=/data/apps/mysql/data/
这个有问题呢 cd /data/apps/mysql/ ./bin/mysqld --initialize-insecure --user=mysql --basedir=/data/apps/mysql --datadir=/data/apps/mysql/data/
created with an empty password
注意: MySQL之前版本mysql_install_db是在mysql_basedir/script下,MySQL 5.7直接放在了mysql_basedir/bin目录下。 "--initialize"已废弃,生成一个随机密码(~/.mysql_secret) "--initialize-insecure"不会生成密码 "--datadir"目录下不能有数据文件
配置MySQL服务
#on centos6 cp /data/apps/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on #on centos7 cp scripts/systemd/mysqld.service.in /usr/lib/systemd/system systemctl status mysqld.service cat > /etc/my.cnf << EOF [client] port=3306 socket = /tmp/mysql.sock [mysqld] character-set-server=utf8 collation-server=utf8_general_ci skip-external-locking skip-name-resolve user=mysql port=3306 basedir=/data/apps/mysql datadir=/data/apps/mysql/data #tmpdir=/usr/local/mysql/temp # server_id = ..... socket=/tmp/mysql.sock log-error=/data/logs/mysql/mysqld-error.log pid-file=/data/apps/mysql/data/mysql.pid open_files_limit=10240 back_log=600 max_connections=500 max_connect_errors=6000 wait_timeout=605800 #open_tables=600 #table_cache = 650 #opened_tables = 630 max_allowed_packet=32M sort_buffer_size=4M join_buffer_size=4M thread_cache_size=300 query_cache_type=1 query_cache_size=256M query_cache_limit=2M query_cache_min_res_unit=16k tmp_table_size=256M max_heap_table_size=256M key_buffer_size=256M read_buffer_size=1M read_rnd_buffer_size=16M bulk_insert_buffer_size=64M lower_case_table_names=1 default-storage-engine=INNODB innodb_buffer_pool_size=2G innodb_log_buffer_size=32M innodb_log_file_size=128M innodb_flush_method=O_DIRECT ##################### thread_concurrency=32 long_query_time=2 slow-query-log=on slow_query_log_file = /data/logs/mysql/slow-mysql.log [mysqldump] quick max_allowed_packet=32M #[mysqld_safe] #log-error=/var/log/mysqld.log #pid-file=/var/run/mysqld/mysqld.pid EOF
启动关闭 mysql 数据库
关闭和启动的最直接就是他们了,启动脚本也是启用他们的 关闭mysql 数据库 mysqladmin --defaults-file=/etc/my.cnf -uroot -p'xx' shutdown 2>&1 killall -15 mysqld 启动 mysqld_safe my.cnf #启动脚本启动 其实就是启用上面的命令 面试遇到 service mysqld start
配置MySQL环境变量
echo -e '\n\nexport PATH=/usr/local/mysql/bin:$PATH\n' >> /etc/profile && source /etc/profile
设置数据库root用户密码
./bin/mysql_secure_installation
创建其他MySQL数据库用户
[root@szlinux02 mysql]# mysql -uroot -p mysql> CREATE DATABASE `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> grant all privileges on testdb.* to 'ryanxu'@'%' identified by 'ABCabc123!@#'; mysql> flush privileges; myqsl> exit
3.启动时没有使用配置文件 如果没有设置使用指定目录my.cnf文件及默认读取目录没有my.cnf文件,表示mysql启动时并没有加载配置文件,而是使用默认配置。
需要修改配置,可以在mysql默认读取的目录中,创建一个my.cnf文件(例如:/etc/my.cnf),把需要修改的配置内容写入,重启mysql后即可生效。
mysqld --verbose --help | grep -A 'Default options'
注意
my.cnf配置文件 官网说:从5.7.18开始不在二进制包中提供my-default.cnf文件,不再需要my.cnf。从源码编译安装的mysql,基本配置在预编译和systemd启动文件中已定义好,不用my.cnf配置。 编辑systemd启动文件 可以直接拿过来用 在rpmbuild要怎么处理好呢 mysql 5.7 默认将 mysqld.service (/usr/local/mysql/)文件安装到了 mysql 安装目录下的 usr/lib/systemd/system/,将 mysqld.service 复制到/usr/lib/systemd/system/目录下 [root@localhost]/usr/local/mysql#cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system cd ~/mysql-5.7.20 cp ./scripts/mysqld.service /usr/lib/systemd/system vi /usr/lib/systemd/system/mysqld.service 配置文件无需改动 启动mysql systemctl enable mysqld.service systemctl daemon-reload systemctl start mysqld.service systemctl status mysqld.service
https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
查看MySQL Innodb引擎当前参数
mysql>show variables like '%innodb%'; mysql>SHOW engine innodb STATUS\G;
other
mysql中utf8和utf8mb4区别 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
二、内容描述
那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。
trouble shooting
#如果改为自己的配置文件就有问题 [root@rpmbuild mysql]# cp /etc/my.cnf.rpmold /etc/my.cnf [root@rpmbuild mysql]# service mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL. ERROR! The server quit without updating PID file (/data/apps/mysql/data/rpmbuild.pid). 原来是初始系统数据库有问题,应该是格式问题 根本在 数据目录没生成 sys 相关目录,我手工 先mysqld --initialize-insecure 再mysqld --initialize-insecure --user=mysql --basedir=/data/apps/mysql/,最后如下 居然成功了 /data/apps/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/apps/mysql/ --datadir=/data/apps/mysql/data/ 加上-DWITH_SYSTEMD=1可以使用systemd控制mysql服务,默认是不开启systemd的 mysql 5.7 默认将 mysqld.service (/usr/local/mysql/)文件安装到了 mysql 安装目录下的 usr/lib/systemd/system/,将 mysqld.service 复制到/usr/lib/systemd/system/目录下 cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system #没开启systemd的原因 rpm -ivh ops_mysql-5.7.18-1.0.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:ops_mysql-5.7.18-1.0 ################################# [100%] cp: 无法获取"/data/apps/mysql/usr/lib/systemd/system/mysqld.service" 的文件状态(stat): 没有那个文件或目录 Failed to execute operation: No such file or directory Failed to start mysqld.service: Unit not found. chmod: 无法访问"/etc/rc.d/init.d/mysqld": 没有那个文件或目录 /var/tmp/rpm-tmp.4yo85p:行25: /etc/init.d/mysqld: 没有那个文件或目录 mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)' Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists! mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket sysd 启动 mysql err log 如下 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 13 - Permission denied) 把启动文件pid目录必一下就行了 sed -i 's!/var/run/mysqld/mysqld.pid!/data/apps/mysql/data/mysqld.pid!' mysqld.service
mysql重启出错:mysqld unknown variable explicit_defaults_for_timestamp=true
see also
Centos7.2 Systemd 方式编译 Mysql5.7.11
CentOS 7.4 使用源码包编译安装MySQL 5.7.20
CentOS-7 下 systemctl 管理 mysql-5.7的不同,配置jemalloc
http://blog.51cto.com/ultrasql/1924467
配置文件相关
mysql数据库参数innodb_buffer_pool_size和max_connections
MySQL 5.7中explicit_defaults_for_timestamp参数