> Linux教程 > 系统运维 >

MySQL/MariaDB/Percona数据库升级脚本

MySQL/MariaDB/Percona数据库升级脚本截取《OneinStack》中upgrade_db.sh,一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们。为防止大版本之间兼容问题,脚本默认仅支持同一大版本之间的升级,如:MySQL-5.6.25升级到MySQL-5.6.26、MySQL-5.5.44升级到MySQL-5.5.45、MariaDB-10.0.20升级到MariaDB-10.0.21;不能跨分支版本且不能跨大版本,如从MySQL-5.5.44升级到PerconaL-5.5.44-37.3、MySQL-5.5.44升级到MySQL-5.6.25。

2015-07-16之前版本如何支持数据库版本升级?

《OneinStack》

 
  1. cd /root/
  2. cp oneinstack/options.conf ~  #备份options.conf
  3. rm -rf oneinstack  #删除旧版
  4. wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz  #下载最新版
  5. tar xzf oneinstack-full.tar.gz
  6. /bin/mv ~/options.conf ./oneinstack  #还原options.conf, 必须使用旧版options.conf文件
  7. cd oneinstack
  8. ./upgrade db  #升级数据库版本,如下图:

《lnmp一键安装包》:

 
  1. cp lnmp/options.conf ~  #备份options.conf
  2. rm -rf lnmp  #删除旧版
  3. wget http://mirrors.linuxeye.com/lnmp-full.tar.gz  #下载最新版
  4. tar xzf lnmp-full.tar.gz
  5. /bin/mv ~/options.conf ./lnmp  #还原options.conf, 必须使用旧版options.conf文件
  6. cd lnmp
  7. ./upgrade db  #升级数据库版本

PS:MySQL/MariaDB/Percona数据库升级脚本内容如下(cat upgrade_db.sh):

 
  1. #!/bin/bash  
  2. # Author:  yeho <lj2007331 AT gmail.com>  
  3. # BLOG:  https://blog.linuxeye.com  
  4. #  
  5. # Notes: OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+  
  6. #  
  7. # Project home page:  
  8. #       http://oneinstack.com  
  9. #       https://github.com/lj2007331/oneinstack  
  10.   
  11. Upgrade_DB()  
  12. {  
  13. cd $oneinstack_dir/src  
  14. [ ! -e "$db_install_dir/bin/mysql" ] && echo "${CWARNING}The MySQL/MariaDB/Percona is not installed on your system! ${CEND}" && exit 1  
  15. OLD_DB_version_tmp=`$db_install_dir/bin/mysql -V | awk '{print $5}' | awk -F, '{print $1}'`  
  16. DB_tmp=`echo $OLD_DB_version_tmp | awk -F'-' '{print $2}'`  
  17. if [ "$DB_tmp" == 'MariaDB' ];then  
  18.     [ "$IPADDR_STATE"x == "CN"x ] && DOWN_ADDR=http://mirrors.aliyun.com/mariadb || DOWN_ADDR=https://downloads.mariadb.org/f  
  19.     LIBC_VERSION=`getconf -a | grep GNU_LIBC_VERSION | awk '{print $NF}'`  
  20.     LIBC_YN=`echo "$LIBC_VERSION < 2.14" | bc`  
  21.     [ $LIBC_YN == '1' ] && GLIBC_FLAG=linux || GLIBC_FLAG=linux-glibc_214  
  22.     DB=MariaDB  
  23.     OLD_DB_version=`echo $OLD_DB_version_tmp | awk -F'-' '{print $1}'`  
  24. elif [ -n "$DB_tmp" -a "$DB_tmp" != 'MariaDB' ];then  
  25.     DB=Percona  
  26.     OLD_DB_version=$OLD_DB_version_tmp  
  27. else  
  28.     DB=MySQL  
  29.     OLD_DB_version=$OLD_DB_version_tmp  
  30. fi  
  31.   
  32. #backup  
  33. while :  
  34. do  
  35.     $db_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "quit" >/dev/null 2>&1  
  36.     if [ $? -eq 0 ];then  
  37.         break  
  38.     else  
  39.         echo  
  40.         read -p "Please input the root password of database: " NEW_dbrootpwd  
  41.         $db_install_dir/bin/mysql -uroot -p${NEW_dbrootpwd} -e "quit" >/dev/null 2>&1  
  42.         if [ $? -eq 0 ];then  
  43.             dbrootpwd=$NEW_dbrootpwd  
  44.             sed -i "s+^dbrootpwd.*+dbrootpwd='$dbrootpwd'+" ../options.conf  
  45.             break  
  46.         else  
  47.             echo "${CFAILURE}$DB root password incorrect,Please enter again! ${CEND}"  
  48.         fi  
  49.     fi  
  50. done  
  51.   
  52. echo  
  53. echo "${CSUCCESS}Starting $DB backup${CEND}......"  
  54. $db_install_dir/bin/mysqldump -uroot -p${dbrootpwd} --opt --all-databases > DB_all_backup_$(date +"%Y%m%d").sql  
  55. [ -f "DB_all_backup_$(date +"%Y%m%d").sql" ] && echo "$DB backup success, Backup file: ${MSG}`pwd`/DB_all_backup_$(date +"%Y%m%d").sql${CEND}"  
  56.   
  57. #upgrade  
  58. echo  
  59. echo "Current $DB Version: ${CMSG}$OLD_DB_version${CEND}"  
  60. [ -e /usr/local/lib/libtcmalloc.so ] && { je_tc_malloc=2; EXE_LINKER="-DCMAKE_EXE_LINKER_FLAGS='-ltcmalloc'"; }  
  61. [ -e /usr/local/lib/libjemalloc.so ] && { je_tc_malloc=1; EXE_LINKER="-DCMAKE_EXE_LINKER_FLAGS='-ljemalloc'"; }  
  62.   
  63. while :  
  64. do  
  65.     echo  
  66.     read -p "Please input upgrade $DB Version(example: $OLD_DB_version): " NEW_DB_version  
  67.     if [ `echo $NEW_DB_version | awk -F. '{print $1"."$2}'` == `echo $OLD_DB_version | awk -F. '{print $1"."$2}'` ]; then  
  68.         if [ "$DB" == 'MariaDB' ];then  
  69.             DB_name=mariadb-${NEW_DB_version}-${GLIBC_FLAG}-${SYS_BIT_b}  
  70.             DB_URL=$DOWN_ADDR/mariadb-${NEW_DB_version}/bintar-${GLIBC_FLAG}-$SYS_BIT_a/$DB_name.tar.gz  
  71.         elif [ "$DB" == 'Percona' ];then  
  72.             DB_name=percona-server-$NEW_DB_version  
  73.             DB_URL=http://www.percona.com/redir/downloads/Percona-Server-`echo $NEW_DB_version | awk -F. '{print $1"."$2}'`/LATEST/source/tarball/$DB_name.tar.gz  
  74.         elif [ "$DB" == 'MySQL' ];then  
  75.             DB_name=mysql-$NEW_DB_version  
  76.             DB_URL=http://cdn.mysql.com/Downloads/MySQL-`echo $NEW_DB_version | awk -F. '{print $1"."$2}'`/$DB_name.tar.gz  
  77.         fi  
  78.             [ ! -e "$DB_name.tar.gz" ] && wget --no-check-certificate -c $DB_URL > /dev/null 2>&1  
  79.               
  80.             if [ -e "$DB_name.tar.gz" ];then  
  81.                 echo "Download [${CMSG}$DB_name.tar.gz${CEND}] successfully! "  
  82.             else  
  83.                 echo "${CWARNING}$DB version does not exist! ${CEND}"  
  84.             fi  
  85.             break  
  86.     else  
  87.             echo "${CWARNING}input error! ${CEND}Please only input '${CMSG}${OLD_DB_version%.*}.xx${CEND}'"  
  88.     fi  
  89. done  
  90.   
  91. if [ -e "$DB_name.tar.gz" ];then  
  92.     echo "[${CMSG}$DB_name.tar.gz${CEND}] found"  
  93.     echo "Press Ctrl+c to cancel or Press any key to continue..."  
  94.     char=`get_char`  
  95.     if [ "$DB" == 'MariaDB' ];then   
  96.         service mysqld stop  
  97.         mv ${mariadb_install_dir}{,_old_`date +"%Y%m%d"`}  
  98.         mv ${mariadb_data_dir}{,_old_`date +"%Y%m%d"`}  
  99.         mkdir -p $mariadb_data_dir;chown mysql.mysql -R $mariadb_data_dir  
  100.         tar xzf $DB_name.tar.gz  
  101.         [ ! -d "$mariadb_install_dir" ] && mkdir -p $mariadb_install_dir  
  102.         mv mariadb-${NEW_DB_version}-*-${SYS_BIT_b}/* $mariadb_install_dir  
  103.         if [ "$je_tc_malloc" == '1' -a "`echo $OLD_DB_version_tmp | awk -F'.' '{print $1"."$2}'`" != '10.1' ];then  
  104.             sed -i 's@executing mysqld_safe@executing mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/libjemalloc.so@' $mariadb_install_dir/bin/mysqld_safe  
  105.         elif [ "$je_tc_malloc" == '2' -a "`echo $OLD_DB_version_tmp | awk -F'.' '{print $1"."$2}'`" != '10.1' ];then  
  106.             sed -i 's@executing mysqld_safe@executing mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/libtcmalloc.so@' $mariadb_install_dir/bin/mysqld_safe  
  107.         fi  
  108.         $mariadb_install_dir/scripts/mysql_install_db --user=mysql --basedir=$mariadb_install_dir --datadir=$mariadb_data_dir  
  109.         chown mysql.mysql -R $mariadb_data_dir  
  110.         service mysqld start  
  111.         $mariadb_install_dir/bin/mysql < DB_all_backup_$(date +"%Y%m%d").sql   
  112.         service mysqld restart  
  113.         $mariadb_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "drop database test;" >/dev/null 2>&1  
  114.         $mariadb_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "reset master;" >/dev/null 2>&1  
  115.         [ $? -eq 0 ] &&  echo "You have ${CMSG}successfully${CEND} upgrade from ${CMSG}$OLD_DB_version${CEND} to ${CMSG}$NEW_DB_version${CEND}"  
  116.     elif [ "$DB" == 'Percona' ];then  
  117.         tar zxf $DB_name.tar.gz   
  118.         cd $DB_name  
  119.         make clean  
  120.         if [ "`echo $NEW_DB_version | awk -F. '{print $1"."$2}'`" == '5.5' ];then  
  121.             cmake . -DCMAKE_INSTALL_PREFIX=$percona_install_dir \  
  122. -DMYSQL_DATADIR=$percona_data_dir \  
  123. -DSYSCONFDIR=/etc \  
  124. -DWITH_INNOBASE_STORAGE_ENGINE=1 \  
  125. -DWITH_PARTITION_STORAGE_ENGINE=1 \  
  126. -DWITH_FEDERATED_STORAGE_ENGINE=1 \  
  127. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  
  128. -DWITH_MYISAM_STORAGE_ENGINE=1 \  
  129. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  
  130. -DWITH_READLINE=1 \  
  131. -DENABLE_DTRACE=0 \  
  132. -DENABLED_LOCAL_INFILE=1 \  
  133. -DDEFAULT_CHARSET=utf8mb4 \  
  134. -DDEFAULT_COLLATION=utf8mb4_general_ci \  
  135. $EXE_LINKER  
  136.         else  
  137.             cmake . -DCMAKE_INSTALL_PREFIX=$percona_install_dir \  
  138. -DMYSQL_DATADIR=$percona_data_dir \  
  139. -DSYSCONFDIR=/etc \  
  140. -DWITH_INNOBASE_STORAGE_ENGINE=1 \  
  141. -DWITH_PARTITION_STORAGE_ENGINE=1 \  
  142. -DWITH_FEDERATED_STORAGE_ENGINE=1 \  
  143. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  
  144. -DWITH_MYISAM_STORAGE_ENGINE=1 \  
  145. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  
  146. -DENABLED_LOCAL_INFILE=1 \  
  147. -DENABLE_DTRACE=0 \  
  148. -DDEFAULT_CHARSET=utf8mb4 \  
  149. -DDEFAULT_COLLATION=utf8mb4_general_ci \  
  150. $EXE_LINKER  
  151.         fi  
  152.         make -j `grep processor /proc/cpuinfo | wc -l`  
  153.         service mysqld stop  
  154.         mv ${percona_install_dir}{,_old_`date +"%Y%m%d"`}  
  155.         mv ${percona_data_dir}{,_old_`date +"%Y%m%d"`}  
  156.         [ ! -d "$percona_install_dir" ] && mkdir -p $percona_install_dir  
  157.         mkdir -p $percona_data_dir;chown mysql.mysql -R $percona_data_dir  
  158.         make install  
  159.         cd ..  
  160.         $percona_install_dir/scripts/mysql_install_db --user=mysql --basedir=$percona_install_dir --datadir=$percona_data_dir  
  161.         chown mysql.mysql -R $percona_data_dir  
  162.         service mysqld start  
  163.         $percona_install_dir/bin/mysql < DB_all_backup_$(date +"%Y%m%d").sql  
  164.         service mysqld restart  
  165.         $percona_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "drop database test;" >/dev/null 2>&1  
  166.         $percona_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "reset master;" >/dev/null 2>&1  
  167.         [ $? -eq 0 ] &&  echo "You have ${CMSG}successfully${CEND} upgrade from ${CMSG}$OLD_DB_version${CEND} to ${CMSG}$NEW_DB_version${CEND}"  
  168.     elif [ "$DB" == 'MySQL' ];then  
  169.         tar zxf $DB_name.tar.gz  
  170.         cd $DB_name  
  171.         make clean  
  172.         if [ "`echo $NEW_DB_version | awk -F. '{print $1"."$2}'`" == '5.5' ];then  
  173.             cmake . -DCMAKE_INSTALL_PREFIX=$mysql_install_dir \  
  174. -DMYSQL_DATADIR=$mysql_data_dir \  
  175. -DSYSCONFDIR=/etc \  
  176. -DWITH_INNOBASE_STORAGE_ENGINE=1 \  
  177. -DWITH_PARTITION_STORAGE_ENGINE=1 \  
  178. -DWITH_FEDERATED_STORAGE_ENGINE=1 \  
  179. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  
  180. -DWITH_MYISAM_STORAGE_ENGINE=1 \  
  181. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  
  182. -DWITH_READLINE=1 \  
  183. -DENABLED_LOCAL_INFILE=1 \  
  184. -DENABLE_DTRACE=0 \  
  185. -DDEFAULT_CHARSET=utf8mb4 \  
  186. -DDEFAULT_COLLATION=utf8mb4_general_ci \  
  187. -DWITH_EMBEDDED_SERVER=1 \  
  188. $EXE_LINKER  
  189.         else  
  190.             cmake . -DCMAKE_INSTALL_PREFIX=$mysql_install_dir \  
  191. -DMYSQL_DATADIR=$mysql_data_dir \  
  192. -DSYSCONFDIR=/etc \  
  193. -DWITH_INNOBASE_STORAGE_ENGINE=1 \  
  194. -DWITH_PARTITION_STORAGE_ENGINE=1 \  
  195. -DWITH_FEDERATED_STORAGE_ENGINE=1 \  
  196. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  
  197. -DWITH_MYISAM_STORAGE_ENGINE=1 \  
  198. -DENABLED_LOCAL_INFILE=1 \  
  199. -DENABLE_DTRACE=0 \  
  200. -DDEFAULT_CHARSET=utf8mb4 \  
  201. -DDEFAULT_COLLATION=utf8mb4_general_ci \  
  202. -DWITH_EMBEDDED_SERVER=1 \  
  203. $EXE_LINKER  
  204.         fi  
  205.         make -j `grep processor /proc/cpuinfo | wc -l`  
  206.         service mysqld stop  
  207.         mv ${mysql_install_dir}{,_old_`date +"%Y%m%d"`}  
  208.         mv ${mysql_data_dir}{,_old_`date +"%Y%m%d"`}  
  209.         [ ! -d "$mysql_install_dir" ] && mkdir -p $mysql_install_dir  
  210.         mkdir -p $mysql_data_dir;chown mysql.mysql -R $mysql_data_dir  
  211.         make install  
  212.         cd ..  
  213.         $mysql_install_dir/scripts/mysql_install_db --user=mysql --basedir=$mysql_install_dir --datadir=$mysql_data_dir  
  214.         chown mysql.mysql -R $mysql_data_dir  
  215.         service mysqld start  
  216.         $mysql_install_dir/bin/mysql < DB_all_backup_$(date +"%Y%m%d").sql  
  217.         service mysqld restart  
  218.         $mysql_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "drop database test;" >/dev/null 2>&1  
  219.         $mysql_install_dir/bin/mysql -uroot -p${dbrootpwd} -e "reset master;" >/dev/null 2>&1  
  220.         [ $? -eq 0 ] &&  echo "You have ${CMSG}successfully${CEND} upgrade from ${CMSG}$OLD_DB_version${CEND} to ${CMSG}$NEW_DB_version${CEND}"  
  221.     fi   
  222. fi  
  223. }  


(责任编辑:IT)