实战!MySQL主从复制一键搭建脚本分享

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 实战!MySQL主从复制一键搭建脚本分享

一、环境说明:

本次准备了两台机器搭建mysql主从复制。只需要安装好操作系统,挂载系统镜像和上传所需的安装包和脚本即可。另外,脚本部分位置需要修改IP地址。

操作系统版本 数据库版本 IP地址 主机名
centos7 8.0.33 192.168.59.249 db1
centos7 8.0.33 192.168.59.250 db2

网盘地址

  1. 链接: https://pan.baidu.com/s/1PUcGP0qSBphCfxCsFFhFSg
  2. 提取码: pvdv

上传安装包和脚本至任意目录下,赋予执行权限,执行mysql_ms_install.sh即可。整个过程中只需要输入数据库的版本号即可。

  1. [root@db1 ~]#sh -x mysql_ms_install.sh

二、安装过程部分截图:

三、脚本内容:

  1. [root@db1 ~]#cat mysql_ms_install.sh
  2. #!/bin/bash
  3. echo "-----------------------------开始MYSQL主从搭建--------------------------------------"
  4. start_time=$(date +%s)
  5. #关闭Selinux
  6. setenforce 0
  7. sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
  8. #关闭防火墙
  9. systemctl stop firewalld
  10. systemctl disable firewalld
  11. systemctl status firewalld
  12. #配置yum源
  13. cd /etc/yum.repos.d/
  14. rm -rf ./*
  15. cat >> /etc/yum.repos.d/centos.repo <<-EOF
  16. [centos]
  17. name=oracle
  18. baseurl=file:///mnt
  19. enabled=1
  20. gpgcheck=0
  21. EOF
  22. cd
  23. mount /dev/sr0 /mnt    
  24. yum clean all|wc -l
  25. yum makecache
  26. yum install expect* -y
  27. yum install wget -y
  28. #yum install gcc build-essential -y
  29. #tar -xvf sshpass.tar.gz
  30. #cd /root/sshpass-1.10
  31. #./configure
  32. #make
  33. #make install
  34.    os_name=${node_name}
  35.    if [[ "$os_name" =~ ^localhost ]];then
  36.        echo "ERROR: hostname: $os_name is invalid,pls check"
  37.        exit -1
  38.    else
  39.        echo "hostname check passed"
  40.        hostnamectl set-hostname ${node_name}db1
  41.    fi
  42. # 变量定义
  43. groupadd mysql
  44. useradd -r -g mysql mysql
  45. # 定义变量
  46. REMOTE_USER="root"
  47. REMOTE_HOST="192.168.59.250"
  48. PASSWORD="123123"
  49. # 本地生成SSH密钥对(如果不存在)
  50. if [ ! -f ~/.ssh/id_rsa ]; then
  51.    ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
  52. fi
  53. # 使用Expect脚本将公钥复制到远程主机
  54. /usr/bin/expect <<EOF
  55. set timeout 10
  56. # 启动ssh-copy-id命令
  57. spawn ssh-copy-id $REMOTE_USER@$REMOTE_HOST
  58. # 处理首次连接提示的 "yes/no" 和密码输入
  59. expect {
  60.    "yes/no" { send "yes\r"; exp_continue }
  61.    "password:" { send "$PASSWORD\r" }
  62. }
  63. expect eof
  64. EOF
  65. # 验证是否成功
  66. ssh $REMOTE_USER@$REMOTE_HOST "echo '免密登录设置成功'"
  67. REMOTE_COMMANDS=$(cat << EOF
  68. echo "hostname:"
  69. os_name=${node_name}
  70.    if [[ "$os_name" =~ ^localhost ]];then
  71.        echo "ERROR: hostname: $os_name is invalid,pls check"
  72.        exit -1
  73.    else
  74.        echo " hostname check passed"
  75.        hostnamectl set-hostname ${node_name}db2
  76.    fi
  77. EOF
  78. )
  79. ssh $REMOTE_USER@$REMOTE_HOST "$REMOTE_COMMANDS"
  80. #添加主机名与IP对应记录
  81. public_ip1=$(hostname -I| grep -o -e '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' |head -n 1)
  82. node_name1=$(hostname)
  83. sleep 3
  84. public_ip2=$(ssh $REMOTE_USER@$REMOTE_HOST "hostname -I | grep -o -e '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' | head -n 1")
  85. node_name2=$(ssh $REMOTE_USER@$REMOTE_HOST "hostname")
  86. sleep 3
  87. echo -e "${public_ip1} ${node_name1}\n${public_ip2} ${node_name2}" >> /etc/hosts
  88. cat /etc/hosts
  89. cd ~
  90. echo "-----------------------------开始MYSQL MASTER安装--------------------------------------"
  91. start_time=$(date +%s)
  92. MYSQL_ROOT_PASSWORD="123456"
  93. REPLICA_USER="repl"
  94. REPLICA_PASSWORD="repl"
  95. echo -e "\e[31m***************一键安装mysql任何版本数据库******************\e[0m"
  96. echo -e "输入安装版本,如\e[31m8.0.27\e[0m"
  97. read version
  98. find / -name mysql | xargs rm -rf
  99. port=$(netstat -antup|grep mysql|wc -l)
  100. if [ $port != 0 ]
  101. then echo "mysql进程存在,请先杀掉进程"
  102. ps -ef |grep mysqld
  103. exit 1
  104. fi
  105. echo "-----------------创建所需目录及用户并上传安装包----------------------------"
  106. # 获取当前所在目录位置
  107. current_dir=$(pwd)
  108. echo "当前所在目录位置: $current_dir"
  109. # 目标路径
  110. target_dir="/opt"
  111. # 检查目标路径是否存在,如果不存在则创建
  112. if [ ! -d "$target_dir" ]; then
  113.    mkdir -p "$target_dir"
  114.    echo "已创建目录: $target_dir"
  115. fi
  116. # 移动当前目录下的所有文件到目标路径
  117. mv $current_dir/* $target_dir
  118. cp mysql_install.sh /opt
  119. echo "已将当前目录下所有文件移动至 $target_dir"
  120. mkdir -p  /data/mysql
  121. groupadd mysql
  122. useradd -r -g mysql mysql
  123. cd /opt/
  124. tar -xvf mysql-$version-linux-glibc2.12-x86_64.tar.xz
  125. mv mysql-$version-linux-glibc2.12-x86_64/  /usr/local/
  126. cd /usr/local/
  127. mv mysql-$version-linux-glibc2.12-x86_64/ mysql
  128. chown -R mysql.mysql /usr/local/mysql/
  129. echo "-----------------------------卸载原有的mysql组件--------------------------"
  130. yum list installed | grep mariadb
  131. yum -y remove mariadb* || true
  132. chown mysql:mysql -R /data/mysql
  133. touch /etc/my.cnf
  134. chmod 644 /etc/my.cnf
  135. MYSQL_ROOT_PASSWORD=123456
  136. cat <<EOF >/etc/my.cnf
  137. [client]
  138. port = 3306
  139. socket = /tmp/mysql.sock

  140. [mysql]
  141. default-character-set = utf8mb4

  142. [mysqld]
  143. user = mysql
  144. port = 3306
  145. basedir = /usr/local/mysql
  146. datadir = /data/mysql
  147. log-error=/data/mysql/mysql.err
  148. socket = /tmp/mysql.sock
  149. pid-file = /data/mysql/mysql.pid
  150. innodb_buffer_pool_size = 8G      # 配置为内存的75%
  151. innodb_buffer_pool_instances = 8   # 配置buffer_pool为8个
  152. innodb_log_file_size = 2G          # 调整日志文件大小
  153. innodb_log_buffer_size = 128M      # InnoDB用于写入磁盘日志文件的缓冲区大小
  154. innodb_flush_log_at_trx_commit = 1 # 保证数据安全
  155. innodb_file_per_table = 1          # 每张表独立表空间
  156. innodb_io_capacity = 2000          # I/O操作数
  157. innodb_read_io_threads = 4         # 读I/O线程
  158. innodb_write_io_threads = 4        # 写I/O线程
  159. innodb_flush_method = O_DIRECT     # 防止双写
  160. default_storage_engine = InnoDB    # 存储引擎默认InnoDB
  161. max_connections = 500              # 最大连接数
  162. max_connect_errors = 1000          # 最大错误连接次数
  163. skip_name_resolve = 1              # 只能用IP地址检查客户端的登录
  164. server-id = 1                       # 主库ID
  165. gtid_mode = ON                      # 启用GTID
  166. enforce-gtid-consistency = ON       # 强制GTID一致性
  167. log-bin = mysql-bin                 # 启用二进制日志
  168. binlog_format = ROW                 # 二进制日志格式
  169. binlog_row_image = FULL             # 行级日志模式
  170. master_info_repository = TABLE      # 主库信息表存储
  171. relay_log_info_repository = TABLE   # 中继日志信息表存储
  172. sync-binlog = 1                     # 保证数据安全
  173. log-slave-updates = 1               # 允许从库更新记录到binlog
  174. binlog_expire_logs_seconds = 604800 # binlog保留时间
  175. slave_parallel_workers = 4          # 从库并行复制线程数
  176. slave_parallel_type = LOGICAL_CLOCK # 并行复制类型
  177. table_open_cache = 4096             # 程打开的表的数量            
  178. table_definition_cache = 2048       # 可以存储在定义缓存中的表定义数量
  179. tmp_table_size = 128M               # 内部内存临时表大小
  180. max_heap_table_size = 256M          # 内部内存临时表的最大值
  181. thread_cache_size = 128             # 连接使用缓存线程
  182. open_files_limit = 65535            # mysqld进程能使用的最大文件描述(FD)符数量
  183. EOF
  184. echo "-----------------------------------初始化-----------------------------------"
  185. cd /usr/local/mysql/bin
  186. ./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
  187. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
  188. path=$(grep 'basedir' /etc/profile|wc -l)
  189. if [ $path !=  0 ]
  190.  then
  191.    echo -e "\e[31m MYSQL_HOME路径存在\e[0m"
  192.  else
  193.    echo "export basedir=/usr/local/mysql/bin" >> /etc/profile
  194.    echo "export PATH=\$PATH:\$basedir"        >> /etc/profile
  195.    source /etc/profile
  196. fi
  197. echo "---------------------------------启动MYSQL服务---------------------------------------"
  198. service mysql start
  199. echo 'export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib'>>/etc/profile
  200. sleep 3
  201. source /etc/profile
  202. cat /data/mysql/mysql.err|grep password
  203. chkconfig --add mysql
  204. chkconfig mysql on
  205. chkconfig --list mysql
  206. echo "-----------------------------恭喜!MYSQL 主库安装成功--------------------------------------"
  207. end_time=$(date +%s)
  208. execution_time=$((end_time - start_time))
  209. echo "脚本执行时间:${execution_time} 秒"
  210. MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.err`
  211. mysqladmin  -uroot -p${MYSQL_OLDPASSWORD} password ${MYSQL_ROOT_PASSWORD}
  212. mysql -uroot -p123456 -e "update mysql.user set host ='%' where user ='root';"
  213. mysql -uroot -p123456 -e "flush privileges;"
  214. mysql -uroot -p123456 << EOF
  215. exit
  216. EOF
  217. sleep 10
  218. #EOF
  219. #)
  220. #ssh $REMOTE_USER@$REMOTE_HOST "$REMOTE_COMMANDS1"
  221. echo "-----------------------------开始安装MYSQL SLAVE--------------------------------------"
  222. source /etc/profile
  223. scp /opt/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz mysql_install.sh root@192.168.59.250:/opt
  224. scp /opt/mysql_install.sh root@192.168.59.250:/opt/
  225. ssh -tt -p 22 root@192.168.59.250 "source /opt/mysql_install.sh"
  226. #REMOTE_USER="root"
  227. ln -fs /usr/local/mysql/bin/mysql /usr/bin/
  228. REMOTE_HOST="192.168.59.250"
  229. #REMOTE_SCRIPT_PATH="/opt/mysql_install.sh"
  230. #ssh 192.168.59.250 "source /opt/mysql_install.sh"
  231. ssh =$REMOTE_HOST <<EOF
  232. if [ $? -eq 0 ]; then
  233.    echo "MySQL 安装已成功完成."
  234. else
  235.    echo "MySQL 安装失败,请检查日志或手动排查问题."
  236. fi
  237. # 添加其他命令,如清理临时文件或重启服务
  238. # 例如: rm /tmp/temp_file
  239. exit
  240. EOF
  241. sleep 10
  242. /usr/bin/expect <<EOF
  243. set timeout 60
  244. # 启动SSH命令
  245. spawn ssh root@192.168.59.249
  246. # 处理首次连接提示的 "yes/no" 和密码输入
  247. expect {
  248.    "Are you sure you want to continue connecting (yes/no)?" { send "yes\r"; exp_continue }
  249.    "password:" { send "123123\r"; exp_continue }
  250.    eof
  251. }
  252. EOF
  253. sleep 10
  254. source /etc/profile
  255. ln -fs /usr/local/mysql/bin/mysql /usr/bin/
  256. MASTER_IP=192.168.59.249
  257. SLAVE_IP=192.168.59.250
  258. # 配置主服务器
  259. function configure_master {
  260. REMOTE_USER="root"
  261. REMOTE_HOST="192.168.59.249"
  262. MYSQL_ROOT_PASSWORD="123456"
  263. REPLICA_USER="repl"
  264. REPLICA_PASSWORD="repl"
  265. SSH_PASSWORD="123123"
  266. /usr/bin/expect <<EOF
  267. set timeout -1
  268. set REMOTE_USER "root"
  269. set REMOTE_HOST "192.168.59.249"
  270. set MYSQL_ROOT_PASSWORD "123456"
  271. set REPLICA_USER "repl1"
  272. set REPLICA_PASSWORD "repl"
  273. set SSH_PASSWORD "123123"
  274. spawn mysql -u$REMOTE_USER -p$MYSQL_ROOT_PASSWORD -h$REMOTE_HOST -e "DROP USER IF EXISTS '$REPLICA_USER'@'%'; CREATE USER '$REPLICA_USER'@'%' IDENTIFIED BY '$REPLICA_PASSWORD'; USE mysql; GRANT REPLICATION SLAVE ON *.* TO '$REPLICA_USER'@'%'; FLUSH PRIVILEGES; SHOW MASTER STATUS;"
  275. set output ""
  276. expect {
  277.    "*password:" {
  278.        send "$MYSQL_ROOT_PASSWORD\r"
  279.        exp_continue
  280.    }
  281.    eof {
  282.        append output $expect_out(buffer)
  283.    }
  284. }
  285. puts "Complete Output:\n$output\n"
  286. set master_status [split $output "\n"]
  287. puts "DEBUG: Master Status List:\n$master_status\n"  ; # 添加调试信息,查看分割后的列表
  288. set file ""
  289. set position ""
  290. foreach line $master_status {
  291.    if {[regexp {\| (\S+) \| (\d+) \|} $line -> file_temp position_temp]} {
  292.        set file $file_temp
  293.        set position $position_temp
  294.        break
  295.    }
  296. }
  297. puts "FILE: $file"
  298. puts "POSITION: $position"
  299. EOF
  300. REMOTE_USER="root"
  301. REMOTE_HOST="192.168.59.249"
  302. MYSQL_ROOT_PASSWORD="123456"
  303. OUTPUT_FILE="/opt/output.txt"
  304. output=$(mysql -u"$REMOTE_USER" -p"$MYSQL_ROOT_PASSWORD" -h"$REMOTE_HOST" -e "SHOW MASTER STATUS\G")
  305. echo "$output" > "$OUTPUT_FILE"
  306. file=$(echo "$output" | grep "File:" | awk '{print $2}')
  307. position=$(echo "$output" | grep "Position:" | awk '{print $2}')
  308. echo "FILE: $file"
  309. echo "POSITION: $position"
  310. scp /opt/output.txt 192.168.59.250:/opt
  311. file=$(cat "/opt/output.txt" | grep "File:" | awk '{print $2}')
  312. position=$(cat "/opt/output.txt" | grep "Position:" | awk '{print $2}')
  313. export FILE="$file"
  314. export POSITION="$position"
  315. }
  316. # 配置从服务器
  317. function configure_slave {
  318. file=$(cat "/opt/output.txt" | grep "File:" | awk '{print $2}')
  319. position=$(cat "/opt/output.txt" | grep "Position:" | awk '{print $2}')
  320. export FILE="$file"
  321. export POSITION="$position"
  322. REMOTE_USER="root"
  323. REMOTE_HOST="192.168.59.250"
  324. MYSQL_ROOT_PASSWORD="123456"
  325. REPLICA_USER="repl"
  326. REPLICA_PASSWORD="repl"
  327. SSH_PASSWORD="123123"
  328. MASTER_HOST="192.168.59.249"
  329. /usr/bin/expect <<EOF
  330. set timeout -1
  331. set REMOTE_USER "root"
  332. set REMOTE_HOST "192.168.59.250"
  333. set MASTER_IP "192.168.59.249"
  334. set MYSQL_ROOT_PASSWORD "123456"
  335. set REPLICA_USER "repl"
  336. set REPLICA_PASSWORD "repl"
  337. set SSH_PASSWORD "123123"
  338. spawn mysql -u$REMOTE_USER -p$MYSQL_ROOT_PASSWORD -h192.168.59.250 -e "CHANGE MASTER TO MASTER_HOST='192.168.59.249', MASTER_USER='$REPLICA_USER', MASTER_PASSWORD='$REPLICA_PASSWORD', MASTER_LOG_FILE='$FILE', MASTER_LOG_POS=$POSITION;CHANGE MASTER TO GET_MASTER_PUBLIC_KEY=1;START SLAVE;"
  339. expect {
  340.    "*password:" {
  341.        send "$MYSQL_ROOT_PASSWORD\r"
  342.        exp_continue
  343.    }
  344.    eof
  345. }
  346. #puts "\nSlave Status:\n$slave_output"
  347. set show_slave_status_cmd "mysql -u$REMOTE_USER -p$MYSQL_ROOT_PASSWORD -h$REMOTE_HOST -e \"SHOW SLAVE STATUS\\\\G\""
  348. spawn sh -c $show_slave_status_cmd
  349. expect {
  350.    "*password:" {
  351.        send "$MYSQL_ROOT_PASSWORD\r"
  352.        exp_continue
  353.    }
  354.    eof {
  355.        set slave_output $expect_out(buffer)
  356.        puts "SHOW SLAVE STATUS completed."
  357.    }
  358. }
  359. puts "\nSlave Status:\n$slave_output"
  360. EOF
  361. configure_master
  362. configure_slave

此脚本为mysql从库安装脚本:

  1. cat mysql_install.sh
  2. #!/bin/bash
  3. echo "-----------------------------开始MYSQL SLAVE安装--------------------------------------"
  4. #关闭Selinux
  5. setenforce 0
  6. sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
  7. #关闭防火墙
  8. systemctl stop firewalld
  9. systemctl disable firewalld
  10. systemctl status firewalld
  11. #配置yum源
  12. cd /etc/yum.repos.d/
  13. rm -rf ./*
  14. cat >> /etc/yum.repos.d/centos.repo <<-EOF
  15. [centos]
  16. name=oracle
  17. baseurl=file:///mnt
  18. enabled=1
  19. gpgcheck=0
  20. EOF
  21. cd
  22. mount /dev/sr0 /mnt    
  23. yum clean all|wc -l
  24. yum makecache
  25. yum install expect* telent* -y
  26. start_time=$(date +%s)
  27. echo -e "\e[31m***************一键安装mysql任何版本数据库******************\e[0m"
  28. echo -e "输入安装版本,如\e[31m8.0.27\e[0m"
  29. read version
  30. find / -name mysql | xargs rm -rf
  31. port=$(netstat -antup|grep mysql|wc -l)
  32. if [ $port != 0 ]
  33. then echo "mysql进程存在,请先杀掉进程"
  34. ps -ef |grep mysqld
  35. exit 1
  36. fi
  37. echo "-----------------创建所需目录及用户并上传安装包----------------------------"
  38. # 获取当前所在目录位置
  39. current_dir=$(pwd)
  40. echo "当前所在目录位置: $current_dir"
  41. # 目标路径
  42. target_dir="/opt"
  43. # 检查目标路径是否存在,如果不存在则创建
  44. if [ ! -d "$target_dir" ]; then
  45.    mkdir -p "$target_dir"
  46.    echo "已创建目录: $target_dir"
  47. fi
  48. # 移动当前目录下的所有文件到目标路径
  49. mv $current_dir/* $target_dir
  50. echo "已将当前目录下所有文件移动至 $target_dir"
  51. mkdir -p  /data/mysql
  52. groupadd mysql
  53. useradd -r -g mysql mysql
  54. cd /opt/
  55. tar -xvf mysql-$version-linux-glibc2.12-x86_64.tar.xz
  56. mv mysql-$version-linux-glibc2.12-x86_64/  /usr/local/
  57. cd /usr/local/
  58. mv mysql-$version-linux-glibc2.12-x86_64/ mysql
  59. chown -R mysql.mysql /usr/local/mysql/
  60. echo "-----------------------------卸载原有的mysql组件--------------------------"
  61. yum list installed | grep mariadb
  62. yum remove mariadb* -y || true
  63. chown mysql:mysql -R /data/mysql
  64. touch /etc/my.cnf
  65. chmod 644 /etc/my.cnf
  66. MYSQL_ROOT_PASSWORD=123456
  67. cat <<EOF >/etc/my.cnf
  68. [client]
  69. port = 3306
  70. socket = /tmp/mysql.sock
  71. [mysql]
  72. default-character-set = utf8mb4
  73. [mysqld]
  74. user = mysql
  75. port = 3306
  76. basedir = /usr/local/mysql
  77. datadir = /data/mysql
  78. log-error=/data/mysql/mysql.err
  79. socket = /tmp/mysql.sock
  80. pid-file = /data/mysql/mysql.pid

  81. # 性能优化
  82. innodb_buffer_pool_size = 8G      # 配置为内存的75%
  83. innodb_buffer_pool_instances = 8   # 配置buffer_pool为8个
  84. innodb_log_file_size = 2G          # 调整日志文件大小
  85. innodb_log_buffer_size = 128M      # InnoDB用于写入磁盘日志文件的缓冲区大小
  86. innodb_flush_log_at_trx_commit = 1 # 保证数据安全
  87. innodb_file_per_table = 1          # 每张表独立表空间
  88. innodb_io_capacity = 2000          # I/O操作数
  89. innodb_read_io_threads = 4         # 读I/O线程
  90. innodb_write_io_threads = 4        # 写I/O线程
  91. innodb_flush_method = O_DIRECT     # 防止双写
  92. default_storage_engine = InnoDB    # 存储引擎默认InnoDB

  93. # 连接优化
  94. max_connections = 500              # 最大连接数
  95. max_connect_errors = 1000          # 最大错误连接次数
  96. skip_name_resolve = 1              # 只能用IP地址检查客户端的登录

  97. # 复制配置
  98. server-id = 2                      # 从库ID
  99. gtid_mode = ON                      # 启用GTID
  100. enforce-gtid-consistency = ON       # 强制GTID一致性
  101. log-bin = mysql-bin                 # 启用二进制日志
  102. binlog_format = ROW                 # 二进制日志格式
  103. binlog_row_image = FULL             # 行级日志模式
  104. master_info_repository = TABLE      # 主库信息表存储
  105. relay_log_info_repository = TABLE   # 中继日志信息表存储
  106. sync-binlog = 1                     # 保证数据安全
  107. log-slave-updates = 1               # 允许从库更新记录到binlog
  108. binlog_expire_logs_seconds = 604800 # binlog保留时间

  109. # 多线程复制
  110. slave_parallel_workers = 4          # 从库并行复制线程数
  111. slave_parallel_type = LOGICAL_CLOCK # 并行复制类型

  112. # 缓存优化
  113. table_open_cache = 4096             # 程打开的表的数量            
  114. table_definition_cache = 2048       # 可以存储在定义缓存中的表定义数量
  115. tmp_table_size = 128M               # 内部内存临时表大小
  116. max_heap_table_size = 256M          # 内部内存临时表的最大值
  117. thread_cache_size = 128             # 连接使用缓存线程
  118. open_files_limit = 65535            # mysqld进程能使用的最大文件描述(FD)符数量
  119. EOF
  120. echo "-----------------------------------初始化-----------------------------------"
  121. cd /usr/local/mysql/bin
  122. ./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
  123. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
  124. path=$(grep 'basedir' /etc/profile|wc -l)
  125. if [ $path !=  0 ]
  126.  then
  127.    echo -e "\e[31m MYSQL_HOME路径存在\e[0m"
  128.  else
  129.    echo "export basedir=/usr/local/mysql/bin" >> /etc/profile
  130.    echo "export PATH=\$PATH:\$basedir"        >> /etc/profile
  131.    source /etc/profile
  132. fi
  133. echo "---------------------------------启动MYSQL服务---------------------------------------"
  134. service mysql start
  135. echo 'export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib'>>/etc/profile
  136. sleep 3
  137. source /etc/profile
  138. cat /data/mysql/mysql.err|grep password
  139. chkconfig --add mysql
  140. chkconfig mysql on
  141. chkconfig --list mysql
  142. ln -fs /usr/local/mysql/bin/mysql /usr/bin/
  143. echo "-----------------------------恭喜!MYSQL 从库安装成功--------------------------------------"
  144. end_time=$(date +%s)
  145. execution_time=$((end_time - start_time))
  146. echo "脚本执行时间:${execution_time} 秒"
  147. MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.err`
  148. mysqladmin  -uroot -p${MYSQL_OLDPASSWORD} password ${MYSQL_ROOT_PASSWORD}
  149. mysql -uroot -p123456 -e "update mysql.user set host ='%' where user ='root';"
  150. mysql -uroot -p123456 -e "flush privileges;"
  151. mysql -uroot -p123456 << EOF
  152. exit
  153. EOF
  154. sleep 10

特别说明:此脚本为1.0版本,还有很多问题,希望大家多提意见,我们继续优化迭代。另外,要感谢国内知名MySQL数据库架构师李伟的鼎力支持,后续我们还会继续合作分享MySQL相关干货。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
27天前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
86 1
|
5天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
4天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
21 5
|
26天前
|
SQL 关系型数据库 MySQL
|
5天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
14天前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
27 1
|
1天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
6 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
49 8
|
2月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
86 6