shell

  1. #!/bin/bash
  2. # Create by
  3. # version 1.0
  4. # //
  5. #
  6.  
  7. # check out lockfile whether or not exist
  8. IsInputParam=""
  9. InputParamFile=""
  10. install_home=`pwd`
  11. mysql_proxy_home=/usr/local/mysql-proxy
  12. install()
  13. {
  14. # 确保脚本不被重复执行
  15. lockfile=/tmp/$(basename $)_lockfile
  16. if [ -f $lockfile ];then
  17. pid=$(cat $lockfile)
  18. ps -p $pid | grep $pid &> /dev/null
  19. if [ $? == ]; then
  20. echo -e "\033[32m the script is already running !!! \033[0m" && exit
  21. else
  22. echo $$ > $lockfile
  23. fi
  24. else
  25. echo $$ > $lockfile
  26. fi
  27.  
  28. setupMode=`cat $InputParamFile |grep "setup-mode" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  29. # 安装lua+MySQL proxy,支持任意局主机安装
  30. if [ "$setupMode" -eq "" ] ; then
  31.  
  32. heartbeatSetup=`cat $InputParamFile |grep "heartbeatSetup" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  33. if [ "$heartbeatSetup" -eq "" ] ; then
  34. installheartbeat;
  35. fi
  36.  
  37. #echo -e "\033[32m *** install lua \033[0m"
  38. #lua_home=$install_home/lua-5.2.
  39. #cd $install_home
  40. # 安装lua,安装前先卸载再安装;
  41. #tar -zxvf $install_home/lua-5.2..tar.gz
  42. #cd $lua_home/src && cd /usr/local/bin && rm -f lua luac
  43. #cd $lua_home/src && cd /usr/local/include && rm -f lua.h luaconf.h lualib.h lauxlib.h lua.hpp
  44. #cd $lua_home/src && cd /usr/local/lib && rm -f liblua.a
  45. #cd $lua_home/doc && cd /usr/local/man/man1 && rm -f lua. luac.
  46.  
  47. #cd $lua_home
  48. #make linux
  49. #make install
  50.  
  51. # 导出环境变量
  52. #export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm"
  53.  
  54. echo -e "\033[32m *** install mysql Proxy \033[0m"
  55. # 安装MySQL Proxy,解压即可使用
  56. tar -zxf $install_home/mysql-proxy-0.8.-linux-el6-x86-64bit.tar.gz -C /usr/local
  57. cd /usr/local
  58.  
  59. # 一点点清理工作
  60. killall - mysql-proxy
  61. rm -rf /usr/local/mysql-proxy
  62.  
  63. mv mysql-proxy-0.8.-linux-el6-x86-64bit mysql-proxy
  64.  
  65. # 设置MySQL Proxy,根据安装参数进行配置
  66. max_open_files=`cat $InputParamFile |grep "max-open-files" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  67. event_threads=`cat $InputParamFile |grep "event-threads" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  68. log_level=`cat $InputParamFile |grep "log-level" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  69. proxy_address=`cat $InputParamFile |grep "proxy-address" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  70. proxy_backend_addresses=`cat $InputParamFile |grep "proxy-backend-addresses" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  71. proxy_read_only_backend_addresses=`cat $InputParamFile |grep "proxy-read-only-backend-addresses" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  72.  
  73. echo "[mysql-proxy]" >> $mysql_proxy_home/mysql-proxy.cnf
  74. # daemon进程运行
  75. echo "daemon=true" >> $mysql_proxy_home/mysql-proxy.cnf
  76. echo "#user=mysql" >> $mysql_proxy_home/mysql-proxy.cnf
  77. echo "proxy-skip-profiling=true" >> $mysql_proxy_home/mysql-proxy.cnf
  78. # 保持连接(启动进程会有2个,一号进程用来监视二号进行,如果二号进程死掉自动重建,此参数在旧版本中无法使用)
  79. echo "keepalive=true" >> $mysql_proxy_home/mysql-proxy.cnf
  80. # 最大文件句柄数
  81. echo "max-open-files=$max_open_files" >> $mysql_proxy_home/mysql-proxy.cnf
  82. # 线程数
  83. echo "event-threads=$event_threads" >> $mysql_proxy_home/mysql-proxy.cnf
  84. # pid文件
  85. echo "pid-file=/var/run/mysql-proxy.pid" >> $mysql_proxy_home/mysql-proxy.cnf
  86. # 日志文件
  87. echo "log-file=/var/log/mysql-proxy.log" >> $mysql_proxy_home/mysql-proxy.cnf
  88. # 日志级别:error|warning|info|message|debug
  89. echo "log-level=$log_level" >> $mysql_proxy_home/mysql-proxy.cnf
  90. # admin-address=主机:端口 - 指定主机名(或IP地址)和端口管理端口。默认为localhost:。
  91. #admin-address=172.20.100.36:
  92. # 数据库用户名(主从上都需建立相同用户)
  93. #admin-username=admin
  94. # 数据库密码
  95. #admin-password=coship
  96. # admin脚本
  97. #admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
  98. # mysql-proxy的ip和port,默认port是4040
  99. echo "proxy-address=$proxy_address" >> $mysql_proxy_home/mysql-proxy.cnf
  100. # mysql主库(写)地址,多个以逗号分隔
  101. echo "proxy-backend-addresses=$proxy_backend_addresses" >> $mysql_proxy_home/mysql-proxy.cnf
  102. # mysql从库(读)地址,多个以逗号分隔
  103. echo "proxy-read-only-backend-addresses=$proxy_read_only_backend_addresses" >> $mysql_proxy_home/mysql-proxy.cnf
  104. # 读写分离脚本
  105. echo "proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" >> $mysql_proxy_home/mysql-proxy.cnf
  106. # 设置文件权限
  107. chmod $mysql_proxy_home/mysql-proxy.cnf
  108.  
  109. echo "export PATH=$PATH:/usr/local/mysql-proxy/bin/" >> /etc/profile
  110. source /etc/profile
  111. sleep
  112. # 启动mysqlProxy
  113. mysql-proxy --defaults-file=$mysql_proxy_home/mysql-proxy.cnf
  114.  
  115. # 设置MySQL Proxy服务操作脚本
  116. echo "#!/bin/bash" >> $mysql_proxy_home/mysql-proxy.sh
  117. echo ". /root/.bashrc" >> $mysql_proxy_home/mysql-proxy.sh
  118. echo ". /etc/profile" >> $mysql_proxy_home/mysql-proxy.sh
  119. echo 'mode=$1' >> $mysql_proxy_home/mysql-proxy.sh
  120. echo 'if [ -z "$mode" ] ; then' >> $mysql_proxy_home/mysql-proxy.sh
  121. echo 'mode="start"' >> $mysql_proxy_home/mysql-proxy.sh
  122. echo "fi" >> $mysql_proxy_home/mysql-proxy.sh
  123. echo 'case $mode in' >> $mysql_proxy_home/mysql-proxy.sh
  124. echo "start)" >> $mysql_proxy_home/mysql-proxy.sh
  125. echo "mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.cnf>/usr/local/mysql-proxy/cn.log &" >> $mysql_proxy_home/mysql-proxy.sh
  126. echo ";;" >> $mysql_proxy_home/mysql-proxy.sh
  127. echo "stop)" >> $mysql_proxy_home/mysql-proxy.sh
  128. echo "killall -9 mysql-proxy" >> $mysql_proxy_home/mysql-proxy.sh
  129. echo ";;" >> $mysql_proxy_home/mysql-proxy.sh
  130. echo "restart)" >> $mysql_proxy_home/mysql-proxy.sh
  131. echo 'if $0 stop ; then' >> $mysql_proxy_home/mysql-proxy.sh
  132. echo '$0 start' >> $mysql_proxy_home/mysql-proxy.sh
  133. echo "else" >> $mysql_proxy_home/mysql-proxy.sh
  134. echo 'echo "Restart failed!"' >> $mysql_proxy_home/mysql-proxy.sh
  135. echo "exit 1" >> $mysql_proxy_home/mysql-proxy.sh
  136. echo "fi" >> $mysql_proxy_home/mysql-proxy.sh
  137. echo ";;" >> $mysql_proxy_home/mysql-proxy.sh
  138. echo "esac" >> $mysql_proxy_home/mysql-proxy.sh
  139. echo "exit 0" >> $mysql_proxy_home/mysql-proxy.sh
  140.  
  141. chmod a+x $mysql_proxy_home/mysql-proxy.sh
  142.  
  143. else
  144. # 安装MySQL数据库
  145. echo
  146. echo -e "\033[32m *** step 1: check whether mysql is already installed? \033[0m"
  147. echo
  148.  
  149. # 一点点清理工作############################################
  150. # 检查当前系统是否已安装MySQL,如果已经安装就卸载
  151. for i in `rpm -qa|grep -i mysql`
  152. do
  153. rpm -q $i &> /dev/null
  154. if [ $? == ]; then
  155. # 删除mysql
  156. rpm -e $i --nodeps &> /dev/null
  157. echo $i "was uninstalled"
  158. fi
  159. done
  160.  
  161. # 处理CentOS内部集成Mysql的情况
  162. touch ys
  163. echo "yes">ys
  164. yum remove mysql-libs <ys >/dev/null
  165.  
  166. # 删除配置文件
  167. rm -f /etc/my.cnf
  168. rm -rf /var/lib/mysql
  169. ############################################################
  170.  
  171. echo
  172. echo -e "\033[32m *** step 2: install packages MySQL-server \033[0m"
  173. echo
  174.  
  175. # 开始安装MySQL服务
  176. rpm -ivh MySQL-server-5.5.-.el6.x86_64.rpm
  177.  
  178. if [ "$?" == ] ;
  179. then
  180. echo -e "\033[32m *** MySQL-server install success! \033[0m"
  181. else
  182. echo -e "\033[32m *** MySQL-server is not installed! \033[0m"
  183. exit
  184. fi
  185.  
  186. echo
  187. echo -e "\033[32m *** step 3: install packages MySQL-client \033[0m"
  188. echo
  189.  
  190. # 开始安装MySQL客户端
  191. rpm -ivh MySQL-client-5.5.-.el6.x86_64.rpm
  192.  
  193. if [ "$?" == ] ;
  194. then
  195. echo -e "\033[32m *** MySQL-client install success! \033[0m"
  196. else
  197. echo -e "\033[32m *** MySQL-client is not installed! \033[0m"
  198. exit
  199. fi
  200.  
  201. echo
  202. echo -e "\033[32m *** step 4: configure installation variables for mysql \033[0m"
  203. echo
  204.  
  205. echo -e "\033[32m *** service mysql start \033[0m"
  206. service mysql start
  207.  
  208. echo -e "\033[32m *** mysqladmin -u root password \033[0m"
  209.  
  210. echo $InputParamFile
  211.  
  212. # 获取数据库设置密码
  213. password=`cat $InputParamFile |grep "password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  214.  
  215. mysqladmin -u root password $password
  216.  
  217. mysql -uroot -p$password -e "grant all on *.* to 'root'@'%' identified by '$password' WITH GRANT OPTION;FLUSH PRIVILEGES;"
  218.  
  219. echo -e "\033[32m *** cretae /etc/my.cnf \033[0m"
  220. cp /usr/share/doc/MySQL-server-5.5./my-huge.cnf /etc/my.cnf
  221.  
  222. character_set_server=`cat $InputParamFile |grep "character_set_server" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  223. tmp_table_size=`cat $InputParamFile |grep "tmp_table_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  224. max_heap_table_size=`cat $InputParamFile |grep "max_heap_table_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  225. lower_case_table_names=`cat $InputParamFile |grep "lower_case_table_names" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  226. key_buffer_size=`cat $InputParamFile |grep "key_buffer_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  227. binlog_ignore_db=`cat $InputParamFile |grep "binlog-ignore-db" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  228. innodb_buffer_pool_size=`cat $InputParamFile |grep "innodb_buffer_pool_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  229. innodb_additional_mem_pool_size=`cat $InputParamFile |grep "innodb_additional_mem_pool_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  230. innodb_log_file_size=`cat $InputParamFile |grep "innodb_log_file_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  231. innodb_log_buffer_size=`cat $InputParamFile |grep "innodb_log_buffer_size" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  232. innodb_flush_log_at_trx_commit=`cat $InputParamFile |grep "innodb_flush_log_at_trx_commit" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  233. innodb_lock_wait_timeout=`cat $InputParamFile |grep "innodb_lock_wait_timeout" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  234. innodb_flush_method=`cat $InputParamFile |grep "innodb_flush_method" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  235. innodb_log_files_in_group=`cat $InputParamFile |grep "innodb_log_files_in_group" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  236. max_connections=`cat $InputParamFile |grep "max_connections" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  237. max_connect_errors=`cat $InputParamFile |grep "max_connect_errors" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  238. innodb_max_dirty_pages_pct=`cat $InputParamFile |grep "innodb_max_dirty_pages_pct" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  239.  
  240. # 默认都加上
  241. sed -i '/\[client\]/a\default-character-set=utf8' /etc/my.cnf
  242.  
  243. # 先统统干掉
  244. sed -i -e "/character_set_server=/d" /etc/my.cnf
  245. sed -i -e "/tmp_table_size=/d" /etc/my.cnf
  246. sed -i -e "/max_heap_table_size=/d" /etc/my.cnf
  247. sed -i -e "/lower_case_table_names=/d" /etc/my.cnf
  248. sed -i -e "/key_buffer_size=/d" /etc/my.cnf
  249. sed -i -e "/binlog-ignore-db=/d" /etc/my.cnf
  250. sed -i -e "/innodb_buffer_pool_size=/d" /etc/my.cnf
  251. sed -i -e "/innodb_additional_mem_pool_size=/d" /etc/my.cnf
  252. sed -i -e "/innodb_log_file_size=/d" /etc/my.cnf
  253. sed -i -e "/innodb_log_buffer_size=/d" /etc/my.cnf
  254. sed -i -e "/innodb_flush_log_at_trx_commit=/d" /etc/my.cnf
  255. sed -i -e "/innodb_lock_wait_timeout=/d" /etc/my.cnf
  256. sed -i -e "/innodb_flush_method=/d" /etc/my.cnf
  257. sed -i -e "/innodb_log_files_in_group=/d" /etc/my.cnf
  258. sed -i -e "/max_connections=/d" /etc/my.cnf
  259. sed -i -e "/max_connect_errors=/d" /etc/my.cnf
  260. sed -i -e "/innodb_max_dirty_pages_pct=/d" /etc/my.cnf
  261.  
  262. # 再加上所有配置
  263. sed -i "/\[mysqld\]/a\character_set_server=$character_set_server" /etc/my.cnf
  264. sed -i "/\[mysqld\]/a\tmp_table_size=$tmp_table_size" /etc/my.cnf
  265. sed -i "/\[mysqld\]/a\max_heap_table_size=$max_heap_table_size" /etc/my.cnf
  266. sed -i "/\[mysqld\]/a\lower_case_table_names=$lower_case_table_names" /etc/my.cnf
  267. sed -i "/\[mysqld\]/a\key_buffer_size=$key_buffer_size" /etc/my.cnf
  268. sed -i "/\[mysqld\]/a\binlog-ignore-db=$binlog_ignore_db" /etc/my.cnf
  269. sed -i "/\[mysqld\]/a\innodb_buffer_pool_size=$innodb_buffer_pool_size" /etc/my.cnf
  270. sed -i "/\[mysqld\]/a\innodb_additional_mem_pool_size=$innodb_additional_mem_pool_size" /etc/my.cnf
  271. sed -i "/\[mysqld\]/a\innodb_log_file_size=$innodb_log_file_size" /etc/my.cnf
  272. sed -i "/\[mysqld\]/a\innodb_log_buffer_size=$innodb_log_buffer_size" /etc/my.cnf
  273. sed -i "/\[mysqld\]/a\innodb_flush_log_at_trx_commit=$innodb_flush_log_at_trx_commit" /etc/my.cnf
  274. sed -i "/\[mysqld\]/a\innodb_lock_wait_timeout=$innodb_lock_wait_timeout" /etc/my.cnf
  275. sed -i "/\[mysqld\]/a\innodb_flush_method=$innodb_flush_method" /etc/my.cnf
  276. sed -i "/\[mysqld\]/a\innodb_log_files_in_group=$innodb_log_files_in_group" /etc/my.cnf
  277. sed -i "/\[mysqld\]/a\max_connections=$max_connections" /etc/my.cnf
  278. sed -i "/\[mysqld\]/a\max_connect_errors=$max_connect_errors" /etc/my.cnf
  279. sed -i "/\[mysqld\]/a\innodb_max_dirty_pages_pct=$innodb_max_dirty_pages_pct" /etc/my.cnf
  280.  
  281. sed -i "/\[myisamchk\]/a\key_buffer_size=$key_buffer_size" /etc/my.cnf
  282.  
  283. # 设置数据库id号
  284. serverid=`cat $InputParamFile |grep "server-id" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  285. sed -i -e '/server-id/d' /etc/my.cnf
  286. sed -i "/\[mysqld\]/a\server-id=$serverid" /etc/my.cnf
  287.  
  288. # 默认去掉该配置项
  289. sed -i '/log-bin=mysql-bin/d' /etc/my.cnf
  290.  
  291. echo -e "\033[32m *** service mysql restart \033[0m"
  292. rm -rf /var/lib/mysql/ib_logfile*
  293. service mysql restart
  294.  
  295. if [ "$?" != ] ;
  296. then
  297.  
  298. rm -rf /var/lib/mysql/ib_logfile*
  299. service mysql restart
  300. fi
  301.  
  302. echo -e "\033[32m *** chkconfig --list mysql \033[0m"
  303. chkconfig --list mysql
  304. if [ "$?" != ] ;
  305. then
  306. chkconfig --add mysql
  307. fi
  308.  
  309. # 添加自启项
  310. chkconfig --level mysql on
  311.  
  312. # 注册启、停、重启、查看状态命令
  313. rm -rf /bin/start_mysql
  314. rm -rf /bin/stop_mysql
  315. rm -rf /bin/status_mysql
  316. rm -rf /bin/restart_mysql
  317.  
  318. echo "sh `pwd`/start_mysql.sh" >> /bin/start_mysql
  319. chmod /bin/start_mysql
  320.  
  321. echo "sh `pwd`/stop_mysql.sh" >> /bin/stop_mysql
  322. chmod /bin/stop_mysql
  323.  
  324. echo "sh `pwd`/status_mysql.sh" >> /bin/status_mysql
  325. chmod /bin/status_mysql
  326.  
  327. echo "sh `pwd`/restart_mysql.sh" >> /bin/restart_mysql
  328. chmod /bin/restart_mysql
  329.  
  330. # 设置互备数据库
  331. # 根据模式进行MySQL数据库的安装工作
  332. # setupMode= 表示只安装单纯的MySQL单机服务
  333. # setupMode= 表示安装主MySQL服务
  334. # setupMode= 表示安装从MySQL服务
  335. # setupMode= 表示安装读写分离服务
  336. # setupMode= 表示安装主主服务主1
  337. # setupMode= 表示安装主主服务主2
  338. # 主主服务中主1和主2区别在于主1需要先安装,不需要知道主2的信息,主2安装需要配置主1的信息
  339. if [ "$setupMode" -eq "" ] ; then
  340.  
  341. # 先把防火墙关了
  342. /etc/init.d/iptables stop
  343.  
  344. # 设置主用mysql
  345. #sed -i "/\[mysqld\]/a\auto_increment_offset=1" /etc/my.cnf
  346. #sed -i "/\[mysqld\]/a\auto_increment_increment=2" /etc/my.cnf
  347. #sed -i "/\[mysqld\]/a\sync_binlog=1" /etc/my.cnf
  348. #sed -i "/\[mysqld\]/a\log-salve-updates" /etc/my.cnf
  349. # 获取从数据库账号
  350. slaveToMasterUser=`cat $InputParamFile |grep "slaveToMaster-user" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  351. # 获取从数据库密码
  352. slaveToMasterPassword=`cat $InputParamFile |grep "slaveToMaster-password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  353. sed -i "/\[mysqld\]/a\log-bin=mysql-bin" /etc/my.cnf
  354.  
  355. # 更改配置文件后需要重启MySQL服务
  356. rm -rf /var/lib/mysql/ib_logfile*
  357. service mysql restart
  358. # 用于访问自身数据账号
  359. echo `mysql -uroot -p$password -e "grant all privileges on *.* to '$slaveToMasterUser'@'%' identified by '$slaveToMasterPassword';FLUSH PRIVILEGES;"`
  360. # 从安装
  361. elif [ "$setupMode" -eq "" ] ; then
  362. # 先把防火墙关了
  363. /etc/init.d/iptables stop
  364.  
  365. # 获取主用数据库IP地址
  366. masterhost=`cat $InputParamFile |grep "master-host" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  367. # 获取主用数据库账号
  368. masteruser=`cat $InputParamFile |grep "master-user" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  369. # 获取主用数据库密码
  370. masterpassword=`cat $InputParamFile |grep "master-password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  371.  
  372. # 获取从数据库IP地址
  373. slavehost=`cat $InputParamFile |grep "slaveToMaster-host" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  374. # 获取从数据库账号
  375. slaveuser=`cat $InputParamFile |grep "slaveToMaster-user" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  376. # 获取从数据库密码
  377. slavepassword=`cat $InputParamFile |grep "slaveToMaster-password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  378.  
  379. echo `mysql -uroot -p$password -e "grant all privileges on *.* to '$slaveuser'@'%' identified by '$slavepassword';FLUSH PRIVILEGES;"`
  380.  
  381. # 登陆主MySQL得到Master Status信息
  382. masterStatus=$(echo `mysql -h$masterhost -u$slaveuser -p$slavepassword -e "show master status\G"`)
  383.  
  384. masterlogfile=$(echo $masterStatus | grep "Position" | tail -n | cut -d ":" -f2- | awk '{print $1}')
  385. masterlogpos=$(echo $masterStatus | grep "Position" | tail -n | cut -d ":" -f2- | awk '{print $3}')
  386.  
  387. # 添加主服务
  388. echo `mysql -uroot -p$password -e "change master to master_host='$masterhost', master_user='$masteruser', master_password='$masterpassword',master_log_file='$masterlogfile', master_log_pos=$masterlogpos;start slave;"`
  389.  
  390. #主主安装(主1)
  391. elif [ "$setupMode" -eq "" ] ; then
  392.  
  393. # 先把防火墙关了
  394. /etc/init.d/iptables stop
  395.  
  396. # 设置主用mysql
  397. #sed -i "/\[mysqld\]/a\auto_increment_offset=1" /etc/my.cnf
  398. #sed -i "/\[mysqld\]/a\auto_increment_increment=2" /etc/my.cnf
  399. #sed -i "/\[mysqld\]/a\sync_binlog=1" /etc/my.cnf
  400. #sed -i "/\[mysqld\]/a\log-salve-updates" /etc/my.cnf
  401. # 获取从数据库账号
  402. slaveToMasterUser=`cat $InputParamFile |grep "slaveToMaster-user" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  403. # 获取从数据库密码
  404. slaveToMasterPassword=`cat $InputParamFile |grep "slaveToMaster-password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  405. sed -i "/\[mysqld\]/a\log-bin=mysql-bin" /etc/my.cnf
  406. sed -i "/\[mysqld\]/a\auto_increment_offset = 1" /etc/my.cnf
  407. sed -i "/\[mysqld\]/a\auto_increment_increment = 2" /etc/my.cnf
  408. sed -i "/\[mysqld\]/a\log-slave-updates" /etc/my.cnf
  409.  
  410. # 更改配置文件后需要重启MySQL服务
  411. rm -rf /var/lib/mysql/ib_logfile*
  412. service mysql restart
  413. # 用于访问自身数据账号
  414. echo `mysql -uroot -p$password -e "grant all privileges on *.* to '$slaveToMasterUser'@'%' identified by '$slaveToMasterPassword';FLUSH PRIVILEGES;"`
  415. #主主安装(主2...n)
  416. elif [ "$setupMode" -eq "" ] ; then
  417. # 先把防火墙关了
  418. /etc/init.d/iptables stop
  419.  
  420. sed -i "/\[mysqld\]/a\log-bin=mysql-bin" /etc/my.cnf
  421. sed -i "/\[mysqld\]/a\auto_increment_offset = 2" /etc/my.cnf
  422. sed -i "/\[mysqld\]/a\auto_increment_increment = 2" /etc/my.cnf
  423. sed -i "/\[mysqld\]/a\log-slave-updates" /etc/my.cnf
  424.  
  425. # 更改配置文件后需要重启MySQL服务
  426. rm -rf /var/lib/mysql/ib_logfile*
  427. service mysql restart
  428.  
  429. # 获取主用数据库IP地址
  430. masterhost=`cat $InputParamFile |grep "master-master-host" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  431. # 获取主用数据库账号
  432. masteruser=`cat $InputParamFile |grep "master-master-user" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  433. # 获取主用数据库密码
  434. masterpassword=`cat $InputParamFile |grep "master-master-password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  435.  
  436. # 获取从数据库IP地址
  437. slavehost=`cat $InputParamFile |grep "slaveToMaster-host" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  438. # 获取从数据库账号
  439. slaveuser=`cat $InputParamFile |grep "slaveToMaster-user" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  440. # 获取从数据库密码
  441. slavepassword=`cat $InputParamFile |grep "slaveToMaster-password" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  442.  
  443. echo `mysql -uroot -p$password -e "grant all privileges on *.* to '$slaveuser'@'%' identified by '$slavepassword';FLUSH PRIVILEGES;"`
  444.  
  445. # 登陆主MySQL得到Master Status信息
  446. masterStatus=$(echo `mysql -h$masterhost -u$slaveuser -p$slavepassword -e "show master status\G"`)
  447.  
  448. masterlogfile=$(echo $masterStatus | grep "Position" | tail -n | cut -d ":" -f2- | awk '{print $1}')
  449. masterlogpos=$(echo $masterStatus | grep "Position" | tail -n | cut -d ":" -f2- | awk '{print $3}')
  450.  
  451. # 添加主服务
  452. echo `mysql -uroot -p$password -e "change master to master_host='$masterhost', master_user='$masteruser', master_password='$masterpassword',master_log_file='$masterlogfile', master_log_pos=$masterlogpos;start slave;"`
  453.  
  454. # 设置同步数据账号
  455. #echo `mysql -h$masterhost -u$slaveuser -p$slavepassword -e "grant replication slave,replication client on *.* to '$slaveuser'@'$slavehost' identified by '$slavepassword';FLUSH PRIVILEGES;"`
  456.  
  457. # 设置对端主主关联
  458. # 登陆主MySQL得到Master Status信息
  459. slaveStatus=$(echo `mysql -u$slaveuser -p$slavepassword -e "show master status\G"`)
  460.  
  461. slavelogfile=$(echo $slaveStatus | grep "Position" | tail -n | cut -d ":" -f2- | awk '{print $1}')
  462. slavelogpos=$(echo $slaveStatus | grep "Position" | tail -n | cut -d ":" -f2- | awk '{print $3}')
  463.  
  464. echo `mysql -h$masterhost -u$slaveuser -p$slavepassword -e "change master to master_host='$slavehost', master_user='$slaveuser', master_password='$slavepassword',master_log_file='$slavelogfile', master_log_pos=$slavelogpos;start slave;"`
  465.  
  466. ########################
  467.  
  468. else
  469. echo "No setupMode";
  470. fi
  471. fi
  472. }
  473.  
  474. installheartbeat()
  475. {
  476.  
  477. echo
  478. echo -e "\033[32m *** step 1: check whether heartbeat is already installed? \033[0m"
  479. echo
  480.  
  481. # 检查当前系统是否已安装heartbeat,如果已经安装就卸载
  482. for i in `rpm -qa|grep heartbeat`
  483. do
  484. rpm -q $i &> /dev/null
  485. if [ $? == ]; then
  486. # 删除heartbeat
  487. rpm -e $i --nodeps &> /dev/null
  488. echo $i "was uninstalled"
  489. fi
  490. done
  491.  
  492. # 删除配置文件
  493. rm -rf /usr/lib/heartbeat
  494. rm -rf /etc/ha.d
  495.  
  496. cd $install_home
  497.  
  498. # 解压安装包
  499. tar -xf packages.tar.gz;
  500.  
  501. # 进入到安装包目录
  502. cd packages
  503.  
  504. # 创建用户
  505. groupadd haclient
  506. useradd hacluster -g haclient
  507. useradd haclient -g haclient
  508.  
  509. # 忽略应用进行安装
  510. rpm -ivh *.rpm --force --nodeps
  511.  
  512. # 安装成功,继续配置
  513. if [ $? == ]; then
  514.  
  515. rm -rf /usr/lib/heartbeat
  516. mkdir -p /usr/lib/heartbeat/
  517.  
  518. \cp -f /usr/lib64/heartbeat/ipfail /usr/lib/heartbeat/
  519.  
  520. \cp -f /usr/share/doc/heartbeat-3.0./ha.cf /etc/ha.d/
  521. \cp -f /usr/share/doc/heartbeat-3.0./haresources /etc/ha.d/
  522. \cp -f /usr/share/doc/heartbeat-3.0./authkeys /etc/ha.d/
  523.  
  524. # 配置鉴权模式
  525. sed -i "/\#auth 1/a\auth 3" /etc/ha.d/authkeys
  526. sed -i "/\#3 md5 Hello\!/a\3 md5 Hello\!" /etc/ha.d/authkeys
  527. sed -i -e '/#auth 1/d' /etc/ha.d/authkeys
  528. sed -i -e '/#3 md5 Hello\!/d' /etc/ha.d/authkeys
  529.  
  530. # 修改文件权限
  531. chmod /etc/ha.d/authkeys
  532.  
  533. # 清空文件内容
  534. echo > /etc/ha.d/ha.cf
  535.  
  536. # 获取主IP和用户名
  537. masterIP=`cat $InputParamFile |grep "masterIP" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  538. masterName=`cat $InputParamFile |grep "masterName" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  539. # 获取备主IP和用户名
  540. backupIP=`cat $InputParamFile |grep "backupIP" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  541. backupName=`cat $InputParamFile |grep "backupName" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  542. # 获取仲裁ip地址
  543. pingIP=`cat $InputParamFile |grep "pingIP" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  544. # 网卡名称
  545. ethName=`cat $InputParamFile |grep "ethName" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  546. # 浮动IP
  547. flotIP=`cat $InputParamFile |grep "flotIP" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  548.  
  549. # 配置用户,先删除再添加
  550. sed -i -e "/$masterName/d" /etc/hosts
  551. sed -i -e "/$backupName/d" /etc/hosts
  552.  
  553. echo "$masterIP $masterName" >> /etc/hosts
  554. echo "$backupIP $backupName" >> /etc/hosts
  555.  
  556. echo "#debugfile /var/log/ha-debug.log" >> /etc/ha.d/ha.cf
  557. echo "logfile /var/log/ha.log" >> /etc/ha.d/ha.cf
  558. echo "#logfacility local0" >> /etc/ha.d/ha.cf
  559. echo "keepalive 2" >> /etc/ha.d/ha.cf
  560. echo "deadtime 10" >> /etc/ha.d/ha.cf
  561. echo "warntime 5" >> /etc/ha.d/ha.cf
  562. echo "initdead 60" >> /etc/ha.d/ha.cf
  563. echo "udpport 694" >> /etc/ha.d/ha.cf
  564. echo "bcast $ethName" >> /etc/ha.d/ha.cf
  565. echo "#mcast eth1 225.0.0.1 694 1 0" >> /etc/ha.d/ha.cf
  566. echo "#ucast eth1 10.0.0.2 " >> /etc/ha.d/ha.cf
  567. echo "auto_failback off" >> /etc/ha.d/ha.cf
  568. echo "#watchdog /dev/watchdog" >> /etc/ha.d/ha.cf
  569. echo "node $masterName" >> /etc/ha.d/ha.cf
  570. echo "node $backupName" >> /etc/ha.d/ha.cf
  571. echo "ping $pingIP" >> /etc/ha.d/ha.cf
  572. echo "#ping_group group1 10.10.99.254 10.10.99.253" >> /etc/ha.d/ha.cf
  573. echo "respawn hacluster /usr/lib/heartbeat/ipfail" >> /etc/ha.d/ha.cf
  574. echo "apiauth ipfail gid=haclient uid=hacluster" >> /etc/ha.d/ha.cf
  575.  
  576. # 添加Mysql配置
  577. echo "$masterName IPaddr::$flotIP/24/$ethName mysql_umount" >> /etc/ha.d/haresources
  578.  
  579. rm -rf /etc/ha.d/resource.d/mysql_umount
  580. rm -rf /etc/ha.d/resource.d/resetslave.properties
  581. rm -rf /etc/ha.d/resource.d/resetslave.sh
  582.  
  583. cp $install_home/resetslave.properties /etc/ha.d/resource.d/
  584. cp $install_home/resetslave.sh /etc/ha.d/resource.d/
  585.  
  586. masterhost=`cat $InputParamFile |grep "master-host"`
  587. if [ -n "$masterhost" ]; then
  588. # 获取主用数据库IP地址
  589.  
  590. # 获取主用数据库账号
  591. masteruser=`cat $InputParamFile |grep "master-user"`
  592. # 获取主用数据库密码
  593. masterpassword=`cat $InputParamFile |grep "master-password"`
  594.  
  595. echo "" > /etc/ha.d/resource.d/resetslave.properties
  596. echo "$masterhost" >> /etc/ha.d/resource.d/resetslave.properties
  597. echo "$masteruser" >> /etc/ha.d/resource.d/resetslave.properties
  598. echo "$masterpassword" >> /etc/ha.d/resource.d/resetslave.properties
  599. # 循环遍历所有从服务
  600. i=
  601. while [ -eq ]
  602. do
  603. # 获取从数据库IP地址
  604. slavehost=`cat $InputParamFile |grep "slave-host$i" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  605. # 获取从数据库账号
  606. slaveuser=`cat $InputParamFile |grep "slave-user$i" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  607. # 获取从数据库密码
  608. slavepassword=`cat $InputParamFile |grep "slave-password$i" | tail -n | cut -d "=" -f2- | awk '{print $1}'`
  609.  
  610. # 如果找不到编号了就结束
  611. if [ -n "$slavehost" ];
  612. then
  613.  
  614. echo "$slavehost" >> /etc/ha.d/resource.d/resetslave.properties
  615. echo "$slaveuser" >> /etc/ha.d/resource.d/resetslave.properties
  616. echo "$slavepassword" >> /etc/ha.d/resource.d/resetslave.properties
  617.  
  618. else
  619. break
  620. fi
  621. i=$(($i+))
  622. done
  623. fi
  624.  
  625. echo "#!/bin/sh" >> /etc/ha.d/resource.d/mysql_umount
  626. echo ". /root/.bashrc" >> /etc/ha.d/resource.d/mysql_umount
  627. echo ". /etc/profile" >> /etc/ha.d/resource.d/mysql_umount
  628. echo "unset LC_ALL; export LC_ALL" >> /etc/ha.d/resource.d/mysql_umount
  629. echo "unset LANGUAGE; export LANGUAGE" >> /etc/ha.d/resource.d/mysql_umount
  630. echo "prefix=/usr" >> /etc/ha.d/resource.d/mysql_umount
  631. echo "exec_prefix=/usr" >> /etc/ha.d/resource.d/mysql_umount
  632. echo "sh /etc/ha.d/shellfuncs" >> /etc/ha.d/resource.d/mysql_umount
  633. echo 'case $1 in' >> /etc/ha.d/resource.d/mysql_umount
  634. echo "'start')" >> /etc/ha.d/resource.d/mysql_umount
  635. echo "sh resetslave.sh start" >> /etc/ha.d/resource.d/mysql_umount
  636. echo "mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.cnf>/usr/local/mysql-proxy/cn.log &" >> /etc/ha.d/resource.d/mysql_umount
  637. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  638. echo "'pre-start')" >> /etc/ha.d/resource.d/mysql_umount
  639. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  640. echo "'post-start')" >> /etc/ha.d/resource.d/mysql_umount
  641. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  642. echo "'stop')" >> /etc/ha.d/resource.d/mysql_umount
  643. echo "killall -9 mysql-proxy" >> /etc/ha.d/resource.d/mysql_umount
  644. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  645. echo "'pre-stop')" >> /etc/ha.d/resource.d/mysql_umount
  646. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  647. echo "'post-stop')" >> /etc/ha.d/resource.d/mysql_umount
  648. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  649. echo "*)" >> /etc/ha.d/resource.d/mysql_umount
  650. echo " echo \"Usage: $0 { start | pre-start | post-start | stop | pre-stop | post-stop }\"" >> /etc/ha.d/resource.d/mysql_umount
  651. echo " ;;" >> /etc/ha.d/resource.d/mysql_umount
  652. echo "esac" >> /etc/ha.d/resource.d/mysql_umount
  653. echo "exit 0" >> /etc/ha.d/resource.d/mysql_umount
  654.  
  655. chmod /etc/ha.d/resource.d/mysql_umount
  656. chmod /etc/ha.d/resource.d/resetslave.sh
  657.  
  658. ln -s /etc/init.d/mysql /etc/ha.d/resource.d/mysql
  659.  
  660. service heartbeat start
  661.  
  662. chkconfig --add heartbeat
  663. chkconfig --level heartbeat on
  664. fi
  665. }
  666.  
  667. paramNum=$#
  668. if [ "$paramNum" != "" ];then
  669. echo "-n \"no start\""
  670. echo "-f \"Install from file ,need filePath after this param\""
  671. echo "ip \"ip addr\""
  672. exit ;
  673. fi;
  674.  
  675. IsInputParam=$
  676. if [ "${IsInputParam}d" != "d" -a "$IsInputParam" != "-f" ]; then
  677. echo "Second parameter must be -f"
  678. exit ;
  679. fi;
  680. InputParamFile=$
  681. if [ ! -e $InputParamFile ]; then
  682. echo "The param file doesn't existed."
  683. exit ;
  684. fi;
  685.  
  686. install;
  687.  
  688. echo "install end"
  689. exit ;

配置文件

  1. ######################################################################
  2. # 该配置文件为安装单机MySQL数据库
  3. # Create by
  4. # 请仔细阅读每项配置,避免安装出错!!
  5. ######################################################################
  6. # 指定MySQL数据库的安装类型
  7. # 表示只安装单纯的MySQL单机服务
  8. # 表示安装主MySQL服务
  9. # 表示安装从MySQL服务
  10. # 表示安装读写分离服务
  11. # 表示安装主主服务主1
  12. # 表示安装主主服务主2
  13. # 主主服务中主1和主2区别在于主1需要先安装,不需要知道主2的信息,主2安装需要配置主1的信息
  14. setup-mode=
  15. # 指定Mysql安装后的root数据库用户的登陆密码(这里安装的数据用户名默认为root)
  16. password=root
  17. # 指定MySQL的serverid,一般单机或者主MySQL默认server-id=1即可,如果是从MySQL需要改成其他值
  18. server-id=
  19. # =======MySQL的my.cnf配置,请根据服务器硬件配置决定=========
  20. # 数据库默认编码
  21. character_set_server=utf8
  22.  
  23. tmp_table_size=64M
  24. max_heap_table_size=64M
  25. # 让MySQL不区分大小写
  26. lower_case_table_names=
  27. # 建议:使用5..x以上版本
  28. # 修改/etc/my.cnf(主备服务器都修改),在mysqld节点下增加如下配置:
  29. # MYISAM--如果使用混合引擎我们需要对key_buffer_size=/ 内存
  30. key_buffer_size=2G
  31. ###关闭global数据库的binlog日志,减少io需求###
  32. binlog-ignore-db = global
  33. # 优化innodb配置。增大innodb数据内存缓冲区,减少io请求;内存的60%
  34. innodb_buffer_pool_size = 8G
  35. innodb_additional_mem_pool_size = 20M
  36. innodb_log_file_size = 512M
  37. innodb_log_buffer_size = 8M
  38. innodb_flush_log_at_trx_commit =
  39. innodb_lock_wait_timeout =
  40. # 以下为需要新添加配置项##
  41. innodb_flush_method = O_DIRECT
  42. innodb_log_files_in_group =
  43. # 在实际商用环境用不到1000个连接,连接太多了对系统性能&CPU消耗对会有影响!
  44. max_connections=
  45. max_connect_errors=
  46. innodb_max_dirty_pages_pct=
  47. # 在商用环境,建议使用AB模式!

MySQL自动化安装(双主多从读写分离)的更多相关文章

  1. Mysql + keepalived 实现双主热备读写分离【转】

    Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论   架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...

  2. mycat 1.6.6.1安装以及配置docker 安装mysql 5.7.24 双主多从读写分离主主切换

    mycat和mysql的高可用参考如下两个图 简介:应用程序仅需要连接HAproxy或者mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 服务器 ...

  3. Mysql双主加Keepalived+读写分离

    一.MySQL于keepalived简介** 前言: 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要 ...

  4. MySQL集群系列2:通过keepalived实现双主集群读写分离

    在上一节基础上,通过添加keepalived实现读写分离. 首先关闭防火墙 安装keepalived keepalived 2台机器都要安装 rpm .el6.x86_64/ 注意上面要替换成你的内核 ...

  5. mycat结合双主复制实现读写分离模式

    简介:应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 本次实验环境架构图 服务器主机规划 主机名 IP  功能 备注 lin ...

  6. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(二)

    在上一篇文章<使用ProxySQL实现MySQL Group Replication的故障转移.读写分离(一) > 中,已经完成了MGR+ProxySQL集群的搭建,也测试了ProxySQ ...

  7. 高可用-mysql安装,双主模式+keepalived

    mysql安装 1.添加用户 groupadd mysql useradd -r -g mysql mysql

  8. MySQL的主从复制+双主模式

    MySQL的主从复制 部署环境: MySQL master 192.168.40.21 MySQL slave  192.168.40.22 思路: 当主MySQL上进行数据上的操作或者变化时,主My ...

  9. MySQL 5.7 双主复制+keepalived,常规业务一般够用了

    业务需求: 为Zabbix搭建2个数据库,一个库给服务器监控用,一个库给网络监控用. 硬件: 两台服务器,硬盘是1.2 T SSD卡,内存128G 架构: 希望做双主复制+keepalived,架构大 ...

随机推荐

  1. 在Eclipse中查看JDK类库的源代码

    http://blog.csdn.net/a81895898/article/details/8486802 在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 “window”-> ...

  2. 使用plupload绕过服务器,批量上传图片到又拍云

    本文最初发布于我的个人博客:Jerry的乐园 综述 论坛或者贴吧经常会需要分享很多图片,上传图片比较差的做法是上传到中央服务器上,中央服务器再转发给静态图片服务器.而这篇文章讲介绍如何使用pluplo ...

  3. 修改Hosts后对火狐不起作用解决办法

    修改Hosts后对火狐不起作用: 重启火狐浏览器仍不起作用的话,执行下面操作即可. FireFox - 选项 - 高级 - 网络 - 立即清除(缓存)  就解决了

  4. Storyboard里面的几种Segue区别和视图的切换

    几种segue:push.modal.popover.replace.cutom. 一.视图切换类型介绍 1.在iPhone和iPad中,segue的类型是不同的. 2.在iPhone中,segue有 ...

  5. [leetcode]_Longest Common Prefix

    问题:寻找最长公共前缀 思路:就是逐一检查每个string中的每一位,碰到不相等的时候,结束:每个string中这一位都相等,加入到common prefix中~ public String long ...

  6. Environment类,获取程序所在机器信息

    一.属性 CommandLine  获取该进程的命令行.CurrentDirectory 获取或设置当前工作目录的完全限定路径.ExitCode 获取或设置进程的退出代码.HasShutdownSta ...

  7. kvm介绍

    KVM(Kernel-Based Virtual Machines)是一个基于Linux内核的虚拟化技术, 可以直接将Linux内核转换为Hypervisor(系统管理程 序)从而使得Linux内核能 ...

  8. recurse_array_change_key_case()递规返回字符串键名全为小写或大写的数组

    //递归返回字符串键名全为小写或大写的数组function recurse_array_change_key_case(&$input, $case = CASE_LOWER){    if( ...

  9. div+css的优势在哪?

    1.符合W3C标准.微软等公司都是他的支持者. 2.所搜引擎更加友好. 3.样式调整更加方便. 4.css简洁的代码,减少了带宽. 5.表现和结构分离.在团队开发中更容易分工 并不是取代table,t ...

  10. EditText 监听回车事件 避免2次触发

    // 侦听回车事件 EidtText txtSN = (EditText) findViewById(R.id.txtSN); txtSN.setOnEditorActionListener(new ...