OpenVMS Source Code Demos
MARIADB_SHUTDOWN_HELPER
$!==============================================================================
$! Title : csmis$com:mariadb_shutdown_helper.com
$! Author : Neil Rieck
$! Caveat : crashing mariadb-5 is dangerous if tx_isolation > 'READ-COMMITTED'
$! History:
$! 105 NSR 150926 copied from csmis$com:ICSIS_SHUTDOWN_HELPER.COM
$!==============================================================================
$ bel[0,8]=7 !
$ dq[0,8]=34 !
$ pid = "" !
$ set control !
$ set noon !
$ write sys$output "-i-starting: ",f$environment("procedure") !
$ ver_flag = f$environment("VERIFY_PROCEDURE") ! save: ON/OFF
$ set nover ! OFF
$ du = "neil" !
$ dp = "passwd123" !
$!==============================================================================
$ write sys$output "csmis$com:mariadb_shutdown_helper.com"
$ write sys$output "====================================="
$ write sys$output "DANGER DANGER DANGER"
$ write sys$output "caveat: a typical MariaDB shutdown may take 10-30 minutes"
$ inquire/nopunct choice "Are you sure? (y/N) "
$ if choice .nes. "Y" then goto fini
$!==============================================================================
$ target_proc = "MARIADB_SERVER" !
$ gosub find_target_proc !
$ if (pid .eqs. "") then goto jump_past_maria_stuff ! not found so jump
$!----------------------------------------------------------------------
$ write sys$output "" !
$ write sys$output "-i-mariadb is running" !
$ write sys$output "-i-shutting down mariadb (pass-1-of-2: no error expected)"
$!~~~ mysqladmin --user='du' --pass='dp' ping
$ mysqladmin --user='du' --pass='dp' ver
$ mysql --user='du' --pass='dp'
show master logs;
purge master logs before current_date;
show master logs;
exit
$ wait 0:0:05 !
$ mysqladmin --user='du' --pass='dp' refresh
$ mysqladmin --user='du' --pass='dp' status
$ mysqladmin --user='du' --pass='dp' shutdown
$ wait 0:0:05 !
$ write sys$output "-i-shutting down mariadb (pass-2-of-2: blind)"
$ mysqladmin --user='du' --pass='dp' --silent shutdown
$ wait 0:0:05 !
$ target_proc = "MARIADB_SERVER" !
$ gosub wait_target_proc_do_not_kill ! wait (but do not kill)
$jump_past_maria_stuff: !
$!----------------------------------------------------------------------
$fini:
$ if ver_flag .eqs. "FALSE"
$ then
$ set nover
$ else
$ set ver
$ endif
$ write sys$output "-i-exiting: ",f$environment("procedure") !
$ exit
$!==============================================================================
$find_target_proc:
$ kill_it = 0
$ goto common_target_proc
$stop_target_proc:
$ kill_it = 1
$common_target_proc:
$ write sys$output ""
$ write sys$output "-i-searching for: ",target_proc
$ target_length = f$length(target_proc)
$ context = "" ! init context
$scan_loop1:
$ pid = f$pid( context ) !
$ if pid .eqs. "" ! we hit the end
$ then
$ write sys$output "-w-warning, process: ",target_proc," was not found"
$ return
$ endif
$ name = f$getjpi( pid,"PRCNAM")
$ name = f$edit( name, "UPCASE,COLLAPSE,COMPRESS")
$!~~~ write sys$output "prcnam: ",name
$!~~~ if name .eqs. target_proc
$!
$! use f$extract to find the process we want to kill
$! caveat: our XCOM process can have any one of the following names
$! TID40xx2 [DISC]
$! TID40xx2 [IDLE]
$! TID40xx2 [RFIL]
$!
$ if f$extract(0,target_length,name) .nes. target_proc
$ then
$ goto scan_loop1
$ endif
$ if (kill_it.eq.1)
$ then
$ write sys$output "-i-stopping process: ",target_proc," pid: ",pid
$ stop proc/id='pid'
$ wait 0:0:02
$ endif
$ return
$!==============================================================================
$!
$! wait for MARIADB_SERVER to exit on its own juice
$! caveat: with InnoDB under Maria-5.5-25 this may require 30 minutes
$!
$wait_target_proc_kill:
$ kill_at_end = 1 !
$ goto wait_target_proc_common !
$wait_target_proc_do_not_kill: !
$ kill_at_end = 0 !
$wait_target_proc_common: !
$ write sys$output "" !
$ target_length = f$length(target_proc) !
$ attempts = 0 ! init
$restart2: !
$ context = "" ! init
$ write sys$output "-i-waiting for: ",target_proc," to exit" !
$scan_loop2: !
$ pid = f$pid( context ) !
$ if pid .eqs. "" ! we hit the end
$ then !
$ if (attempts.eq.0) !
$ then !
$ write sys$output "-w-warning, process: ",target_proc," was never found"
$ else !
$ write sys$output "-i-process: ",target_proc," has exited"
$ endif !
$ return !
$ endif !
$ name = f$getjpi( pid,"PRCNAM") !
$ name = f$edit( name, "UPCASE,COLLAPSE,COMPRESS") !
$!~~~ write sys$output "prcnam: ",name !
$!~~~ if name .eqs. target_proc
$ if f$extract(0,target_length,name) .eqs. target_proc !
$ then !
$ write sys$output "-i-found process: ",target_proc," pid: ",pid !
$ attempts = attempts + 1 !
$!------------------------------------------------------------------------------
$! After telling mariadb to shutdown twice you should see the following events:
$! 1) flush binary logs to one or two: MYSQL055_ROOT:[log]mariadb-bin.######
$! 2) process redo/rollback files: MYSQL055_ROOT:[log]ib_logfile#.
$! 3) write the following to MYSQL055_ROOT:[mysql_server]MYSQLD.LOG
$! a) "normal shutdown" -- but still waiting for engines to exit
$! b) "InnoDB: Shutdown completed" -- InnoDB has exited
$! 4) MariaDB_Server should exit shortly after 3b
$! CAVEAT: You might be able to get away with killing the server process between
$! steps 3a and 3b proided tx_isoloation <= READ-COMMITTED
$!------------------------------------------------------------------------------
$ if (attempts .ge. 10) !
$ then
$ write sys$output "-i-testing server log file (test-10)"
$ search MYSQL055_ROOT:[mysql_server]MYSQLD.LOG; "InnoDB: Shutdown completed"/nowarn
$ saved_status = $status
$ yada = f$integer(saved_status)
$ if ((yada.and.7).eq.1)
$ then
$ write sys$output "-w-logfile looks okay (test-10) so will kill mariadb"
$ stop proc/id='pid'
$ wait 0:0:02
$ return
$ endif
$ endif
$ if (attempts .ge. 15) ! perhaps should be 20?
$ then
$ write sys$output "-i-testing server log file (test-15)"
$ search MYSQL055_ROOT:[mysql_server]MYSQLD.LOG; "Normal shutdown"/nowarn
$ saved_status = $status
$ yada = f$integer(saved_status)
$ if ((yada.and.7).eq.1)
$ then
$ write sys$output "-w-logfile looks okay (test-15) so will kill mariadb"
$ stop proc/id='pid'
$ wait 0:0:02
$ return
$ endif
$ endif
$ if (attempts .le. 30) !
$ then
$ write sys$output "-i-will sleep 60 seconds then try again (",attempts,"/30) time:",f$cvtime()
$ wait 0:0:59 ! wait one minute
$ goto restart2
$ endif
$ if (kill_at_end .eq. 0) !
$ then
$ write sys$output ""
$ write sys$output " ======================================================================"
$ write sys$output "-w-waited for too many tries so will exit this script",bel
$ write sys$output "-w-EXITING SHUTDOWN SCRIPT",bel
$ write sys$output "-i-Hints:"
$ write sys$output " Task-1: check for recent output to file: [.mysql_server]MYSQLD.LOG"
$ write sys$output " You can safely kill MariaDB_Server if you see something like this:"
$ write sys$output " 150913 18:57:28 InnoDB: Starting shutdown..."
$ write sys$output " 150913 18:57:30 InnoDB: Shutdown completed; log sequence number 639589672735"
$ write sys$output " 150913 18:57:30 [Note] KAWC96$DKE3:[MYSQL055.][bin.alpha]MYSQLD.EXE;1: Shutdown complete"
$ write sys$output " Task-2: check for recent writes to files in [.log]"
$ write sys$output " dir [.log]/width=file=25/date=mod/since="+ dq +"-:59:59"+ dq
$ write sys$output " ======================================================================"
$ exit !
$ else !
$ write sys$output "-w-waited for too many tries so will kill it"
$ stop proc/id='pid' !
$ wait 0:0:02 !
$ return !
$ endif !
$ else
$ goto scan_loop2
$ endif
$!==============================================================================