Archiv pro štítek: sql

Linux mini-howto: Jak rychle smazat všechny tabulky v MySQL databázi

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Databáze MySQL/MariaDB je důvěrně známá a napříč opensource světem široce používaná, obsahuje dva jednoduché SQL příkazy DROP TABLE a DROP DATABASE pro smázení tabulky či celé db.

mini-howto-mysql-delete-all-tables-blog-headerBohužel/bohudík neexistuje žadný příkaz “DROP ALL TABLES” ve smyslu smaž všechny tabulky v aktuální db.

Když už narazíte na “zkryplený” návrh celé DB, kde si původní autor dohání potřebu řádků a relací množstvím a tabulek a jejich jméno používá jako klíč je na čase po notné dávce relaxační hudby vymyslet jak smazat těch 1146 tabulek, jasně můžete udělat drop databases a pak create database, ale třeba to zrovna takto nechcete/nemůžete.

Varianta 1. (ktéra se mi vůbec nelíbí zápisem, ale je elegantní)

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; 

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 

Varianta 2. (aneb plivneme si postaru unixovsky do dlaní)

# mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Hotovo! Užívejte moudře a díky za pozornost.

František Havel, MOJEservery.cz

Nebojte se SQLite!

SQLite je transakční databázových systém, s nulovou konfigurací, bez serverové části, jednoduchý, kompaktní, lehký design, postavený nad souborovým systémem respektive souborem.

SQLiteLogo3

SQLite je velmi populární, né vždy je totiž nutné a hlavně možné nasadit plnohodnotný klient-server SQL server (Mariandb, Postgres) ale mít po ruce možnost a výhody sql nad souborem se často hodí (např. i v systému Android).

Ve své podstatě jde o implementaci relačního databázového systému a standardu SQL-92 realizovaného v jazyce C (mimochodem zajímavě napsaná knihovna s implementací objektů pomocí struktur, pointerů).

Architektura SQLite z francouzské wikipedie
Architektura SQLite z francouzské wikipedie

Velmi často se používá SQLite v jazyce Perl přes knihovnu DBI, ukažme si základní snippet ve kterém bude vše co je potřeba pro práci s touto databází.

  • připojení /connect
  • vytvoření tabulky /create
  • vložení záznamu / insert
  • vyhledání záznamu / search
  • úprava záznamu / update
  • smazání záznamu / delete

Instalace:

Debian, Ubuntu

root@havel-machine:~# apt-get install sqlite3 libdbd-sqlite3-perl

CentOS, Fedora or RHEL

root@havel-machine:~# yum install sqlite perl-DBD-SQLite

 

#!/usr/bin/perl
 
use DBI;
use strict;
 
my $driver   = "SQLite";
my $db_name = "sqlite.db";
my $dbd = "DBI:$driver:dbname=$db_name";
 
# sqlite nepoužívý jméno a heslo
my $username = "";
my $password = "";
 
# vytvoříme a připojíme se db
# zároveň dojte k vytvoření souboru databáze sqlite.db
my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 }) or die $DBI::errstr;
 
# vytvoříme tabulku
my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
             (ID INTEGER PRIMARY KEY     AUTOINCREMENT,
              HOSTNAME       TEXT    NOT NULL,
              OS             CHAR(50),
              CPULOAD        REAL););

# provedeme dotaz
my $ret = $dbh->do($stmt);

if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Tabulka vytvořena\n"; }

# vložíme řádky do tabulky
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD) 
           VALUES ('linux-01', 'Debian 8', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
           VALUES ('linux-02', 'CentOS 7', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
           VALUES ('windows-01', 'Windows Server 2012', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
# získání dat z tabulky a výpis
$stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);

my $obj = $dbh->prepare($stmt);
$ret = $obj->execute() or die $DBI::errstr;
 
if($ret < 0) { print STDERR $DBI::errstr; } while(my @row = $obj->fetchrow_array()) {
      print "ID: ". $row[0] . "\n";
      print "HOSTNAME: ". $row[1] ."\n";
      print "OS: ". $row[2] ."\n";
      print "CPULOAD: ". $row[3] ."\n\n";
}
 
# změna záznamu
$stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='CentOS 7';);

$ret = $dbh->do($stmt) or die $DBI::errstr;
 
if( $ret < 0 ) { print STDERR $DBI::errstr; }
else { print STDERR "Aktualizováno $ret řádků\n"; }

# smazání
$stmt = qq(DELETE from NETWORK where ID=2;);
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Smazáno $ret řádků\n"; }

# Odpojení databáze
$dbh->disconnect();

 

Jak je vidět z příkladu použití je skutečně jednoduché a přímočaré, nebojte se ho vyzkoušet ve svých projektech, mnoho lidí do startu špatně odhadne požadavky a SQLite je tím pádem neprávem ignorováno jako něco podřadného, přejít na “vyšší” databáze z SQLite je triviální.

Knihovny (binding) existuje pro celou řadu programovacích jazyků kromě  uvedeného Perl, např. C/C++, Python, Lua, PHP, ale např. i Delphi a další.

SQLite není okrajový zapadlý projekt, je integrován přímo do systému Android pro uložení persistentních dat, používá ho iPhone nebo společnost Airbus ve svém software či firma Adobe, Bosh, Dropbox. (https://www.sqlite.org/famous.html)

SQLite používám rád, přemýšlejte o něm.

https://www.sqlite.org

František Havel