OPTIMIZE all MySQL database tables via ColdFusion
ColdFusion, MySQLEver want to run a script that does an OPTIMIZE of all tables in your database? First off, you can do this with a shell script or cron job with something like: "
mysqlcheck -u root -p --auto-repair --check --optimize --all-databasesBut what if you, say, don't have a full-time DBA on staff, and want to run these on a schedule which you can easily control with ColdFusion? That was our situation, and so here's what I came up with. We ran it last weekend during our scheduled "maintenance window" and it took about 90 minutes with no downtime on a MySQL 5.1 18G database
(disclaimer: the speed of this process may vary, depending on numerous variables such as hardware, memory, version of MySQL, etc.)
<!--- set these according to your database size: 14400 and 1800 were used after extensive testing
on a system with 8G ram and quad core in 2009 for an 18G database; you can easily try different
values here by trying them in the URL
(ex: /OPTIMIZE_ALL_DB_tables.cfm?queryTimeout=5&numOfTables=5) --->
<cfparam name="URL.RequestTimeout" default="14400">
<cfparam name="URL.queryTimeout" default="1800">
<cfparam name="URL.myDatasource" default="my_database">
<cfparam name="URL.numOfTables" default="1000000">
<!--- set u/p to one that has permissions to run OPTIMIZE & FLUSH on your tables --->
<cfset Variables.myUsername = "db_user">
<cfset Variables.myPass = "my_password">
<cfset Variables.toAddresses = "webmaster@mydomain.com;aaron@mydomain.com">
<cfset Variables.fromAddress = "webmaster@mydomain.com">
<cfsetting requesttimeout="#URL.RequestTimeout#">
<!--- get host and instance if they don't already exist --->
<cfif NOT IsDefined("Server.hostName")>
<cftry>
<cfset local.oInetAddress = CreateObject("java", "java.net.InetAddress")>
<cfset Server.hostName = local.oInetAddress.getLocalHost().getHostName()>
<cfcatch type="application">
<cfset Server.hostName = "Could not determine with java.net.InetAddress">
</cfcatch>
</cftry>
</cfif>
<cfif NOT IsDefined("Server.instanceName")>
<cftry>
<cfset local.oJRun = CreateObject("Java", "jrunx.kernel.JRun")>
<cfset Server.instanceName = local.oJRun.getServerName()>
<cfcatch type="application">
<cfset Server.instanceName = "Could not determine with jrunx.kernel.JRun">
</cfcatch>
</cftry>
</cfif>
<cfquery name="rsAllTables"
datasource="#URL.myDatasource#"
username="#Variables.myUsername#"
password="#Variables.myPass#">
SHOW TABLES IN peoplexs_test;
</cfquery>
<!--- <cfdump var="#rsAllTables#" format="text"> --->
<cfset processInfo = "">
<cfoutput query="rsAllTables" maxrows="#URL.numOfTables#">
<cfset dbErrorInfo = "">
<cfset anyErrorInfo = "">
<cfset beginProcessInfo = "">
<cfset endProcessInfo = "">
<cfsavecontent variable="beginProcessInfo">
--- <strong>"OPTIMIZE TABLE #rsAllTables.TABLES_IN_PEOPLEXS_TEST#" started</strong>... <br/>
</cfsavecontent>
<cfset processInfo &= beginProcessInfo>
#beginProcessInfo#
<cfflush>
<cftry>
<cfquery name="qOptimizeTable"
datasource="peoplexs_test"
username="#Variables.myUsername#"
password="#Variables.myPass#"
timeout="#URL.queryTimeout#">
OPTIMIZE TABLE #rsAllTables.TABLES_IN_PEOPLEXS_TEST#;
</cfquery>
<cfquery name="qFlushTable"
datasource="peoplexs_test"
username="#Variables.myUsername#"
password="#Variables.myPass#">
FLUSH TABLE #rsAllTables.TABLES_IN_PEOPLEXS_TEST#;
</cfquery>
<cfcatch type="database">
<cfsavecontent variable="dbErrorInfo">
<span style="color:red;">
Database ERROR: "#cfcatch.Cause.Message#" on
"#cfcatch.SQL#"
</span><br/>
</cfsavecontent>
<cfset processInfo &= dbErrorInfo>
#dbErrorInfo#
</cfcatch>
<cfcatch type="any">
<cfsavecontent variable="anyErrorInfo">
<span style="color:red;">
<cfdump var="#cfcatch#" format="text">
</span><br/>
</cfsavecontent>
<cfset processInfo &= anyErrorInfo>
#anyErrorInfo#
</cfcatch>
</cftry>
<cfsavecontent variable="endProcessInfo">
------ done with #rsAllTables.TABLES_IN_PEOPLEXS_TEST#. <br/><br/>
</cfsavecontent>
<cfset processInfo &= endProcessInfo>
#endProcessInfo#
<cfflush>
</cfoutput>
<cfmail to="#Variables.toAddresses#"
from="#Variables.fromAddress#"
subject="OPTIMIZE_ALL_DB_tables.cfm on #Server.hostName#/#Server.instanceName# at #DateFormat(Now(), 'yyyy-mm-dd')#"
type="HTML"
server="localhost">
<cfoutput>#Trim(processInfo)#</cfoutput>
</cfmail>



Loading....