我正在寻找一种直接的方法来对我的mysql服务器上托管的所有数据库运行查询。
我有一堆Magento安装,我想截断所有数据库上的所有Magento日志表:
我认为在mysql中很容易实现,但我找不到直接的答案/解决方案。
* 更新*
根据@Ollie Jones的说法,如果没有商店程序或服务器端语言(PHP或其他),就无法做到这一点
更新1
我选择遵循PHP方法(@samitha)有两个原因:
答案 0 :(得分:12)
SELECT DISTINCT SCHEMA_NAME AS `database`
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql')
ORDER BY SCHEMA_NAME
获取系统中所有非MYSQL数据库的列表。
SELECT TABLE_SCHEMA AS `database`,
TABLE_NAME AS `table`
FROM information_schema.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME
为您提供所有数据库中所有实际表(不包括TABLES
表等SYSTEM VIEW和用户定义视图的列表)的列表。
然后,您应该在程序中实现逻辑,以确保在截断某些表之前,对于每个数据库,它确实是一个Magento数据库。否则,你可能会成为同事中的一个被鄙视的人。 : - )
修改强>
这是一个存储过程。
您需要对其进行编辑,以完全按照您的需要进行操作;特别是,它计算行而不是截断表,并且它不包含正确的日志表列表。 (发布这样一个极具破坏性的存储过程对我来说是不负责任的;你应该自己编辑它来做破坏性的部分。)
DELIMITER $$
DROP PROCEDURE IF EXISTS `zap_magento_logs`$$
CREATE PROCEDURE `zap_magento_logs`()
BEGIN
-- declare variables for database and table names
DECLARE dbname VARCHAR(128) DEFAULT '';
DECLARE tbname VARCHAR(128) DEFAULT '';
DECLARE done INTEGER DEFAULT 0;
-- declare cursor for list of log tables
DECLARE log_table_list CURSOR FOR
SELECT TABLE_SCHEMA AS `database`,
TABLE_NAME AS `table`
FROM `information_schema`.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME IN
(
'log_customer',
'log_visitor',
'log_visitor_info',
'log_url',
'log_url_info',
'log_quote'
)
ORDER BY TABLE_SCHEMA, TABLE_NAME;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET done = 1;
OPEN log_table_list;
log_table: LOOP
FETCH log_table_list INTO dbname, tbname;
IF done = 1 THEN
LEAVE log_table;
END IF;
-- create an appropriate text string for a DDL or other SQL statement
SET @s = CONCAT('SELECT COUNT(*) AS num FROM ',dbname,'.',tbname);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP log_table;
CLOSE log_table_list;
END$$
DELIMITER ;
您可以通过发出SQL命令
来运行它 CALL zap_magento_logs();
答案 1 :(得分:5)
PHP方法是:
$tables = array(
'log_customer',
'log_visitor',
'log_visitor_info',
'log_url',
'log_url_info',
'log_quote',
'report_viewed_product_index',
'report_compared_product_index',
'report_event',
'catalog_compare_item',
);
$dbh = new PDO('mysql:host=localhost;', 'USERNAME', 'PASSWORD', array(
PDO::ATTR_PERSISTENT => true
));
$sql = $dbh->query('SHOW DATABASES');
$getAllDbs = $sql->fetchALL(PDO::FETCH_ASSOC);
foreach ($getAllDbs as $DB) {
foreach ($tables as $table) {
$dbh->query('TRUNCATE TABLE ' . $DB['Database'] . '.' . $table);
};
};
答案 2 :(得分:2)
我不想编写代码来解决这个问题,所以我发现了一个不同的解决方案。我写了SQL,生成我需要的SQL。所以我将以下内容保存到名为createSomeSQL.sql的文件中:
SET sql_mode='PIPES_AS_CONCAT';
select
'truncate table ' || dbs.database || '.someLogTable;'
as ''
from (SELECT DISTINCT SCHEMA_NAME AS `database`
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'test')
ORDER BY SCHEMA_NAME) as dbs;
您可以将第4行中的SQL替换为您想要的任何内容。然后我运行此命令来生成我需要的SQL:
mysql -u root -p < createSomeSQL.sql > sqlToExecute.sql
替换&#34; root&#34;当然,还有你的用户名。现在,文件sqlToExecute.sql包含一个脚本,您可以运行该脚本来对所有数据库执行该SQL。
答案 3 :(得分:1)
尝试以下(非常基本,没有错误处理,可能根本不起作用,我没有对此进行测试):
$db = mysqli_connect(); // your database connection
$tables = ["log_customer", "log_visitor", "log_visitor_info"]; // array with all the tables
foreach ($tables as $table) {
mysqli_query($db, "TRUNCATE TABLE `".$table."`"); // executes query for each element in the array
}