mysql主主搭建(版本5.7.32)
Posted 西风h
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql主主搭建(版本5.7.32)相关的知识,希望对你有一定的参考价值。
#!/bin/bash
echo "本地yum源是否配置完毕,是请忽略,否请按CTRL+C退出!"
yum -y install numactl
sleep 3
echo "自动化安装mysql-5.7.32解压版(主/从):"
read -p "请根据实际数据挂载盘输入mysql安装的主目录(建议目录/data):" maindir
if [ -f /root/mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz ];then
echo "创建主目录并解压包:"
mkdir $maindir
cd /root
tar xf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.32-linux-glibc2.12-x86_64 mysql
mv mysql $maindir
echo "创建用户:"
useradd mysql -s /sbin/nologin
echo "创建数据目录:"
mkdir -p $maindir/mysql/data
chown -R mysql:mysql $maindir/mysql
echo "选择主从生成的my.cnf配置:"
read -p "请确定是主库或是从库,主输入:1,从输入2:" type
if [ $type -eq 1 ];then
cat > /etc/my.cnf << EOF
[client]
port= 3306
socket=$maindir/mysql/data/mysql.sock
[mysqld]
#master一般设置为1
server-id=1
sync_binlog = 1
auto-increment-increment = 2
auto-increment-offset = 1
binlog_checksum = none
slave-skip-errors = all
slave-skip-errors=ddl_exist_errors
#开启binlog
log-bin=mysql-bin
#binlog格式:混合。如不设置,默认为SBR模式,在导入含innodb表的数据库时会出错
binlog_format=row #(此处要启用行模式)
binlog-row-image=full #5.6以后才开始支持(此处要用full,不要用minimal)
#设置自动清理binlog日志,可能根据网站访问量和硬盘可用空间来定义这个值,15天清理一次
expire_logs_days=15
#开启gtid
gtid_mode=on
#开启从库写入binlog
log-slave-updates=on
#强制gtid一致性,开启后对于特定create table不被支持
enforce-gtid-consistency=true
port=3306
datadir=$maindir/mysql/data
basedir=$maindir/mysql
socket=$maindir/mysql/data/mysql.sock
user=mysql
#指定日志和pid位置#
log-error=$maindir/mysql/data/mysql-error.log
pid-file=$maindir/mysql/data/mysqld.pid
#MySQL全文索引查询关键词最小长度限制调为1
ft_min_word_len=1
#开启timestamp自动更新#
explicit_defaults_for_timestamp=true
#关闭符号链接支持#
symbolic-links=0
#不区分大小写#
lower_case_table_names=1
#禁用DNS解析#
skip-name-resolve
#INNODB重点优化参数:缓存用户表及索引数据,一般设置为系统内存的50%,但是得根据实际预留#
innodb_buffer_pool_size=4G
#MyISAM重点优化参数:指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度#
key_buffer_size=32M
#分配简单索引扫描,范围索引扫描,无索引全表扫描的表连接 缓存的大小#
join-buffer-size=2M
#在每个connection(session)第一次需要使用这个buffer的时候,一次性分配设置的内存#
sort-buffer-size=4M
#读查询操作所能使用的缓冲区大小,该参数对应的分配内存也是每连接独享#
read_buffer_size=4M
#针对按某种特定顺序(如ORDER BY子句)输出的查询结果(默认256K)加速排序操作后的读数据,提高读分类行的速度#
read_rnd_buffer_size=16M
#MyISAM表发生变化时重新排序所需的缓冲#
myisam_sort_buffer_size=128M
#关闭query-cache#
query-cache-size=0
query_cache_type=0
#临时HEAP数据表的最大长度#
tmp_table_size=256M
#重新利用保存在缓存中线程的数量#
thread_cache_size=64
#开启慢日志查询#
log-slow-admin-statements
slow-query-log=on
slow-launch-time=2
slow-query-log-file=$maindir/mysql/data/mysql-slow.log
#表描述符缓存大小,可减少文件打开/关闭次数#
table-open-cache=1024
#设置最大连接(用户)数#
max-connections=3000
#如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)5000次,则MySQL会无条件强制阻止此客户端连接#
max_connect_errors=5000
#不写入硬盘而是写入系统缓存#
#日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新,只会在整个操作系统挂了时才可能丢数据#
innodb_flush_log_at_trx_commit=2
#限制server接受的数据包大小#
max_allowed_packet=300M
#设置编码格式#
collation-server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
#忽略客户端字符集#
skip-character-set-client-handshake
#开启了log-bin创建function需要开启
log_bin_trust_function_creators=1
sql-mode="NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
group_concat_max_len=2000
#捕捉死锁到error日志
innodb_print_all_deadlocks=1
EOF
elif [ $type -eq 2 ];then
cat > /etc/my.cnf <<EOF
[client]
port= 3306
socket=$maindir/mysql/data/mysql.sock
[mysqld]
#slave一般设置为2
server-id=2
sync_binlog = 1
binlog_checksum = none
auto-increment-increment = 2
auto-increment-offset = 2
slave-skip-errors = all
#开启binlog
log-bin=mysql-bin
#binlog格式:混合。如不设置,默认为SBR模式,在导入含innodb表的数据库时会出错
binlog_format=row #(此处要启用行模式)
binlog-row-image=full #5.6以后才开始支持(此处要用full,不要用minimal)
#设置自动清理binlog日志,可能根据网站访问量和硬盘可用空间来定义这个值,15天清理一次
expire_logs_days=15
#开启中继日志完整性
relay_log_recovery=1
#需要忽略复制的数据库
replicate-ignore-db=mysql
#其他参数
slave-skip-errors=1062,1032
slave-skip-errors=ddl_exist_errors
read_only=on
skip-slave-start
#强制gtid一致性,开启后对于特定create table不被支持
enforce-gtid-consistency=on
#开启gtid
gtid_mode=on
#开启从库写入binlog
log-slave-updates=on
port=3306
datadir=$maindir/mysql/data
basedir=$maindir/mysql
socket=$maindir/mysql/data/mysql.sock
user=mysql
#指定日志和pid位置#
log-error=$maindir/mysql/data/mysql-error.log
pid-file=$maindir/mysql/data/mysqld.pid
#MySQL全文索引查询关键词最小长度限制调为1
ft_min_word_len=1
#开启timestamp自动更新#
explicit_defaults_for_timestamp=true
#关闭符号链接支持#
symbolic-links=0
#不区分大小写#
lower_case_table_names=1
#禁用DNS解析#
skip-name-resolve
#INNODB重点优化参数:缓存用户表及索引数据,一般设置为系统内存的50%,但是得根据实际预留#
innodb_buffer_pool_size=4G
#MyISAM重点优化参数:指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度#
key_buffer_size=32M
#分配简单索引扫描,范围索引扫描,无索引全表扫描的表连接 缓存的大小#
join-buffer-size=2M
#在每个connection(session)第一次需要使用这个buffer的时候,一次性分配设置的内存#
sort-buffer-size=4M
#读查询操作所能使用的缓冲区大小,该参数对应的分配内存也是每连接独享#
read_buffer_size=4M
#针对按某种特定顺序(如ORDER BY子句)输出的查询结果(默认256K)加速排序操作后的读数据,提高读分类行的速度#
read_rnd_buffer_size=16M
#MyISAM表发生变化时重新排序所需的缓冲#
myisam_sort_buffer_size=128M
#关闭query-cache#
query-cache-size=0
query_cache_type=0
#临时HEAP数据表的最大长度#
tmp_table_size=256M
#重新利用保存在缓存中线程的数量#
thread_cache_size=64
#开启慢日志查询#
log-slow-admin-statements
slow-query-log=on
slow-launch-time=2
slow-query-log-file=$maindir/mysql/data/mysql-slow.log
#表描述符缓存大小,可减少文件打开/关闭次数#
table-open-cache=1024
#设置最大连接(用户)数#
max-connections=3000
#如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)5000次,则MySQL会无条件强制阻止此客户端连接#
max_connect_errors=5000
#不写入硬盘而是写入系统缓存#
#日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新,只会在整个操作系统挂了时才可能丢数据#
innodb_flush_log_at_trx_commit=2
#限制server接受的数据包大小#
max_allowed_packet=300M
#设置编码格式#
collation-server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
#忽略客户端字符集#
skip-character-set-client-handshake
#开启了log-bin创建function需要开启
log_bin_trust_function_creators=1
sql-mode="NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
group_concat_max_len=2000
#捕捉死锁到error日志
innodb_print_all_deadlocks=1
EOF
else
echo "输入错误,请重新输入!"
exit
fi
free -m
read -p "请输入innodb_buffer_pool_size的大小(如果mysql独占机器,请把值设置为至少系统内存一半,输入格式为'*G',譬如2G):" size
sed -i "s/4G/$size/g" /etc/my.cnf
echo "初始化数据库:"
$maindir/mysql/bin/mysqld --initialize-insecure --user=mysql
#如果报错,执行"rm -rf $maindir/mysql/data/*"再重新执行初始化操作
cp $maindir/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod 700 /etc/init.d/mysqld
sed -i '46,47d' /etc/init.d/mysqld
sed -i '45a\\basedir='$maindir'/mysql' /etc/init.d/mysqld
sed -i '46a\\datadir='$maindir'/mysql/data' /etc/init.d/mysqld
echo "启动服务:"
/etc/init.d/mysqld start
echo "停止服务:/etc/init.d/mysqld stop"
echo "查看服务状态:"
/etc/init.d/mysqld status
ps -ef|grep mysql
echo "export PATH=$PATH:$maindir/mysql/bin" >> /etc/profile
source /etc/profile
echo "切记登入命令行执行:DROP user mysql.sys@localhost删除系统无用用户!"
echo "如果直接运行mysql提示command not found请重新打开会话窗口!"
echo "请记得修改mysql的root密码并进行授权!"
echo "主库后续操作参考:"
echo "GRANT replication slave ON *.* TO 'repl'@'从库ip' IDENTIFIED BY 'repl' WITH GRANT OPTION;"
echo "quit"
echo "show master status;"
echo "/etc/init.d/mysqld restart"
echo "从库后续操作参考:"
echo "stop slave;"
echo "CHANGE MASTER TO MASTER_HOST='主库IP',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.######',MASTER_LOG_POS=###;"
echo "start slave;"
echo "quit"
echo "/etc/init.d/mysqld restart"
#主主结构互为主从,刚才的主从配置对调操作一遍。
else
echo "请把相应的包上传到/root目录,再进行下一步!"
exit 0
fi
以上是关于mysql主主搭建(版本5.7.32)的主要内容,如果未能解决你的问题,请参考以下文章