Пример #1
0
 /**
  * Purges old data from the following tables:
  * - log_visit
  * - log_link_visit_action
  * - log_conversion
  * - log_conversion_item
  * - log_action
  */
 public function purgeData()
 {
     $maxIdVisit = $this->getDeleteIdVisitOffset();
     // break if no ID was found (nothing to delete for given period)
     if (empty($maxIdVisit)) {
         return;
     }
     $logTables = self::getDeleteTableLogTables();
     // delete data from log tables
     $where = "WHERE idvisit <= ?";
     foreach ($logTables as $logTable) {
         // deleting from log_action must be handled differently, so we do it later
         if ($logTable != Common::prefixTable('log_action')) {
             Db::deleteAllRows($logTable, $where, "idvisit ASC", $this->maxRowsToDeletePerQuery, array($maxIdVisit));
         }
     }
     // delete unused actions from the log_action table (but only if we can lock tables)
     if (Db::isLockPrivilegeGranted()) {
         $this->purgeUnusedLogActions();
     } else {
         $logMessage = get_class($this) . ": LOCK TABLES privilege not granted; skipping unused actions purge";
         Log::warning($logMessage);
     }
     // optimize table overhead after deletion
     Db::optimizeTables($logTables);
 }
Пример #2
0
 /**
  * @group Core
  */
 public function testOptimize()
 {
     // make sure optimizing myisam tables works
     $this->assertTrue(Db::optimizeTables(array('table1', 'table2')) !== false);
     // make sure optimizing both myisam & innodb results in optimizations
     $this->assertTrue(Db::optimizeTables(array('table1', 'table2', 'table3', 'table4')) !== false);
     // make sure innodb tables are skipped
     $this->assertTrue(Db::optimizeTables(array('table3', 'table4')) === false);
 }
Пример #3
0
 private function optimizeTable(OutputInterface $output, $dryRun, $table)
 {
     $output->write("Optimizing table '{$table}'...");
     if ($dryRun) {
         $output->write("[dry-run, not optimising table]");
     } else {
         Db::optimizeTables(Common::prefixTable($table), $force = true);
     }
     $output->writeln("Done.");
 }
 function delete()
 {
     $this->log("Deleting logs for today...");
     $db = \Zend_Registry::get('db');
     $sql = "DELETE FROM " . Common::prefixTable('log_visit') . "\n\t\t\t\tWHERE date(visit_last_action_time) = CURRENT_DATE();";
     $db->query($sql);
     foreach (array('log_link_visit_action', 'log_conversion', 'log_conversion_item') as $table) {
         $sql = "DELETE FROM " . Common::prefixTable($table) . "\n\t\t \t\tWHERE date(server_time) = CURRENT_DATE();";
         $db->query($sql);
     }
     $tablesToOptimize = array(Common::prefixTable('log_link_visit_action'), Common::prefixTable('log_conversion'), Common::prefixTable('log_conversion_item'), Common::prefixTable('log_visit'));
     \Piwik\Db::optimizeTables($tablesToOptimize);
     $this->log("done");
 }
Пример #5
0
 /**
  * Purges old data from the following tables:
  * - log_visit
  * - log_link_visit_action
  * - log_conversion
  * - log_conversion_item
  * - log_action
  *
  * @param int $deleteLogsOlderThan The number of days after which log entires are considered old.
  *                                 Visits and related data whose age is greater than this number
  *                                 will be purged.
  */
 public function purgeData($deleteLogsOlderThan)
 {
     $dateUpperLimit = Date::factory("today")->subDay($deleteLogsOlderThan);
     $this->logDeleter->deleteVisitsFor($start = null, $dateUpperLimit->getDatetime());
     $logTables = self::getDeleteTableLogTables();
     // delete unused actions from the log_action table (but only if we can lock tables)
     if (Db::isLockPrivilegeGranted()) {
         $this->rawLogDao->deleteUnusedLogActions();
     } else {
         $logMessage = get_class($this) . ": LOCK TABLES privilege not granted; skipping unused actions purge";
         Log::warning($logMessage);
     }
     // optimize table overhead after deletion
     Db::optimizeTables($logTables);
 }
Пример #6
0
 /**
  * Purges old report/metric data.
  *
  * If $keepBasicMetrics is false, old numeric tables will be dropped, otherwise only
  * the metrics not in $metricsToKeep will be deleted.
  *
  * If $reportPeriodsToKeep is an empty array, old blob tables will be dropped. Otherwise,
  * specific reports will be deleted, except reports for periods in $reportPeriodsToKeep.
  *
  * @param bool $optimize If tables should be optimized after rows are deleted. Normally,
  *                       this is handled by a scheduled task.
  */
 public function purgeData($optimize = false)
 {
     // find archive tables to purge
     list($oldNumericTables, $oldBlobTables) = $this->getArchiveTablesToPurge();
     // process blob tables first, since archive status is stored in the numeric archives
     if (!empty($oldBlobTables)) {
         // if no reports should be kept, drop tables, otherwise drop individual reports
         if (empty($this->reportPeriodsToKeep) && !$this->keepSegmentReports) {
             Db::dropTables($oldBlobTables);
         } else {
             foreach ($oldBlobTables as $table) {
                 $where = $this->getBlobTableWhereExpr($oldNumericTables, $table);
                 if (!empty($where)) {
                     $where = "WHERE {$where}";
                 }
                 Db::deleteAllRows($table, $where, "idarchive ASC", $this->maxRowsToDeletePerQuery);
             }
             if ($optimize) {
                 Db::optimizeTables($oldBlobTables);
             }
         }
     }
     // deal with numeric tables
     if (!empty($oldNumericTables)) {
         // if keep_basic_metrics is set, empty all numeric tables of metrics to purge
         if ($this->keepBasicMetrics == 1 && !empty($this->metricsToKeep)) {
             $where = "WHERE name NOT IN ('" . implode("','", $this->metricsToKeep) . "') AND name NOT LIKE 'done%'";
             foreach ($oldNumericTables as $table) {
                 Db::deleteAllRows($table, $where, "idarchive ASC", $this->maxRowsToDeletePerQuery);
             }
             if ($optimize) {
                 Db::optimizeTables($oldNumericTables);
             }
         } else {
             Db::dropTables($oldNumericTables);
         }
     }
 }
Пример #7
0
 public function optimizeArchiveTable()
 {
     $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled();
     Db::optimizeTables($archiveTables);
 }
Пример #8
0
 private function optimizeTables(OutputInterface $output)
 {
     foreach (self::$logTables as $table) {
         $output->write("Optimizing table {$table}... ");
         $timer = new Timer();
         $prefixedTable = Common::prefixTable($table);
         $done = Db::optimizeTables($prefixedTable);
         if ($done) {
             $output->writeln("done. <comment>" . $timer . "</comment>");
         } else {
             $output->writeln("skipped! <comment>" . $timer . "</comment>");
         }
     }
     $this->writeSuccessMessage($output, array("Table optimization finished."));
 }
Пример #9
0
 /**
  * Purges old report/metric data.
  *
  * If $keepBasicMetrics is false, old numeric tables will be dropped, otherwise only
  * the metrics not in $metricsToKeep will be deleted.
  *
  * If $reportPeriodsToKeep is an empty array, old blob tables will be dropped. Otherwise,
  * specific reports will be deleted, except reports for periods in $reportPeriodsToKeep.
  *
  * @param bool $optimize If tables should be optimized after rows are deleted. Normally,
  *                       this is handled by a scheduled task.
  */
 public function purgeData($optimize = false)
 {
     list($oldNumericTables, $oldBlobTables) = $this->getArchiveTablesToPurge();
     // process blob tables first, since archive status is stored in the numeric archives
     if (!empty($oldBlobTables)) {
         foreach ($oldBlobTables as $table) {
             $where = $this->getBlobTableWhereExpr($oldNumericTables, $table);
             if (!empty($where)) {
                 $where = "WHERE {$where}";
             }
             Db::deleteAllRows($table, $where, "idarchive ASC", $this->maxRowsToDeletePerQuery);
         }
         if ($optimize) {
             Db::optimizeTables($oldBlobTables);
         }
     }
     $this->segmentArchiveIds = null;
     if (!empty($oldNumericTables)) {
         foreach ($oldNumericTables as $table) {
             $conditions = array("name NOT LIKE 'done%'");
             $bind = array();
             if ($this->keepBasicMetrics && !empty($this->metricsToKeep)) {
                 $metricFields = Common::getSqlStringFieldsArray($this->metricsToKeep);
                 $bind = $this->metricsToKeep;
                 $conditions[] = sprintf("name NOT IN (%s)", $metricFields);
             }
             $keepWhere = $this->getBlobTableWhereExpr($oldNumericTables, $table);
             if (!empty($keepWhere)) {
                 $conditions[] = $keepWhere;
             }
             $where = 'WHERE ' . implode(' AND ', $conditions);
             Db::deleteAllRows($table, $where, "idarchive ASC", $this->maxRowsToDeletePerQuery, $bind);
         }
         if ($optimize) {
             Db::optimizeTables($oldNumericTables);
         }
     }
 }
 /**
  * @param OutputInterface $output
  * @param Date[] $dates
  * @param bool $forceOptimzation
  */
 private function optimizeArchiveTables(OutputInterface $output, $dates, $forceOptimzation = false)
 {
     $output->writeln("Optimizing archive tables...");
     foreach ($dates as $date) {
         $numericTable = ArchiveTableCreator::getNumericTable($date);
         $this->performTimedPurging($output, "Optimizing table {$numericTable}...", function () use($numericTable, $forceOptimzation) {
             Db::optimizeTables($numericTable, $forceOptimzation);
         });
         $blobTable = ArchiveTableCreator::getBlobTable($date);
         $this->performTimedPurging($output, "Optimizing table {$blobTable}...", function () use($blobTable, $forceOptimzation) {
             Db::optimizeTables($blobTable, $forceOptimzation);
         });
     }
 }