Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
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
предоставляет вам список всех фактических таблиц (за исключением SYSTEM VIEWs, таких как таблица TABLES
, и пользовательские представления) во всех базах данных.
Затем вы должны реализовать логику в своей программе, чтобы гарантировать, что для каждой базы данных это действительно база данных 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();
Мне не хотелось писать код, чтобы решить эту проблему, поэтому я нашел другое решение. Я написал 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;
Вы можете заменить SQL в строке 4 тем, что хотите. Затем я запустил эту команду для генерации SQL, который мне нужен:
mysql -u root -p < createSomeSQL.sql > sqlToExecute.sql
Замените «root» своим именем пользователя, конечно. Теперь файл sqlToExecute.sql содержит скрипт, который вы можете запустить для выполнения этого SQL для всех ваших баз данных.
SELECT CONCAT("GRANT DELETE,INSERT,SELECT,UPDATE ON `",TABLE_SCHEMA, "`.* TO 'someuser'@'%';") FROM information_schema.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'a_table_in_all_similar_databases' ORDER BY TABLE_SCHEMA ;
– PeteW
2 January 2018 в 14:52
Попробуйте следующее (очень простая, без обработки ошибок, может вообще не работать, я не тестировал это):
$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
}
Подход 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);
};
};