Журнал LinuxFormat - перейти на главную

LXF169:Рубрика сисадмина

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Бо­лее слож­ные за­про­сы)
(Бо­лее слож­ные за­про­сы)
Строка 116: Строка 116:
 
Так­же есть обыч­ные ко­ман­ды управ­ления сер­ви­са­ми. Сна­ча­ла нуж­но обес­пе­чить за­пуск сер­ви­са при за­груз­ке сис­те­мы:
 
Так­же есть обыч­ные ко­ман­ды управ­ления сер­ви­са­ми. Сна­ча­ла нуж­но обес­пе­чить за­пуск сер­ви­са при за­груз­ке сис­те­мы:
  
# chkconfig mysqld on
+
# chkconfig mysqld on
  
 
За­тем нуж­но за­пус­тить сер­вис пря­мо сей­час:
 
За­тем нуж­но за­пус­тить сер­вис пря­мо сей­час:
  
# service mysqld start
+
# service mysqld start
  
 
По­сле это­го вы­полните ко­ман­ду mysql_secure_installation для соз­дания на­чаль­ной кон­фи­гу­ра­ции. Это нуж­но сде­лать толь­ко один раз. У вас за­про­сят па­роль root, но на дан­ном эта­пе его еще нет, по­это­му про­сто на­жми­те Enter. За­тем вам пред­ло­жат за­дать но­вый па­роль root; за­дай­те хо­ро­ший на­деж­ный па­роль, по­то­му что у это­го поль­зо­ва­те­ля есть пол­ный ад­минист­ра­тив­ный кон­троль над всей ба­зой дан­ных. Правильнее будет назначить па­роль, от­лич­ный от па­ро­ля root в Linux. За­тем, сле­дуя ука­заниям про­грам­мы, вы долж­ны:
 
По­сле это­го вы­полните ко­ман­ду mysql_secure_installation для соз­дания на­чаль­ной кон­фи­гу­ра­ции. Это нуж­но сде­лать толь­ко один раз. У вас за­про­сят па­роль root, но на дан­ном эта­пе его еще нет, по­это­му про­сто на­жми­те Enter. За­тем вам пред­ло­жат за­дать но­вый па­роль root; за­дай­те хо­ро­ший на­деж­ный па­роль, по­то­му что у это­го поль­зо­ва­те­ля есть пол­ный ад­минист­ра­тив­ный кон­троль над всей ба­зой дан­ных. Правильнее будет назначить па­роль, от­лич­ный от па­ро­ля root в Linux. За­тем, сле­дуя ука­заниям про­грам­мы, вы долж­ны:
Строка 159: Строка 159:
 
{{Врезка|right|Ширина=40%|Заголовок=Сно­ва в шко­лу |Содержание=
 
{{Врезка|right|Ширина=40%|Заголовок=Сно­ва в шко­лу |Содержание=
 
Ес­ли вы хо­ти­те боль­ше уз­нать об SQL (но не хо­ти­те по­ку­пать книгу), я бы по­со­ве­то­вал зай­ти на w3schools.com и щелк­нуть по ссыл­ке «Learn SQL» (Изу­ча­ем SQL). Здесь вы най­де­те ру­ко­во­дства, спи­сок команд SQL и чу­дес­ное ма­лень­кое при­ло­жение, ко­то­рое по­зво­лит на­би­рать SQL-за­про­сы и вы­пол­нять их на тес­то­вой ба­зе дан­ных. Ес­ли немно­го рас­ши­рить на­ши рам­ки, на сай­те так­же есть ма­те­ри­ал для изу­чения HTML, CSS, PHP, XML и мно­го­го дру­го­го. Ес­ли вы никогда не бы­ли на этом сай­те, зай­ди­те ту­да немед­ля. Обе­щаю, вы не по­жа­лее­те!
 
Ес­ли вы хо­ти­те боль­ше уз­нать об SQL (но не хо­ти­те по­ку­пать книгу), я бы по­со­ве­то­вал зай­ти на w3schools.com и щелк­нуть по ссыл­ке «Learn SQL» (Изу­ча­ем SQL). Здесь вы най­де­те ру­ко­во­дства, спи­сок команд SQL и чу­дес­ное ма­лень­кое при­ло­жение, ко­то­рое по­зво­лит на­би­рать SQL-за­про­сы и вы­пол­нять их на тес­то­вой ба­зе дан­ных. Ес­ли немно­го рас­ши­рить на­ши рам­ки, на сай­те так­же есть ма­те­ри­ал для изу­чения HTML, CSS, PHP, XML и мно­го­го дру­го­го. Ес­ли вы никогда не бы­ли на этом сай­те, зай­ди­те ту­да немед­ля. Обе­щаю, вы не по­жа­лее­те!
 +
}}
 +
{{Врезка|right|Ширина=40%|Заголовок=Вер­сия Enterprise |Содержание=
 +
Те­перь MySQL при­над­ле­жит Oracle, и про­грам­ма дви­жет­ся по пу­ти дру­гих при­ло­жений (вро­де Tripwire), ко­то­рые бы­ли от­кры­ты­ми, а за­тем ста­ли ком­мер­че­­ски­­ми. Бес­плат­ная от­кры­тая вер­сия все еще доступ­на (и ра­бо­та­ет от­лич­но), но функ­цио­наль­ность уров­ня пред­при­ятия те­перь до­бав­ля­ет­ся в плат­ную вер­сию про­дук­та. Эта вер­сия обеспечи­ва­ет сред­ст­ва «го­ря­че­го» ре­зерв­но­го ко­пи­ро­вания, ре­п­ли­ка­цию, под­держ­ку от­казо­устой­чи­во­сти, мас­шта­би­руе­мость, ау­дит и, ра­зу­ме­ет­ся, тех­под­держ­ку. За под­роб­но­стя­ми за­хо­ди­те на www.mysql.com/products/enterprise.
 
}}
 
}}
 
Об­ра­ти­те внимание, что вы­ра­жения в MySQL за­кан­чи­ва­ют­ся точ­кой с за­пя­той. Это часть син­так­си­са MySQL, а не SQL (ес­ли вы по­хо­жи на ме­ня, то бу­де­те по­сто­ян­но про эти точ­ки с за­пя­той за­бы­вать!).
 
Об­ра­ти­те внимание, что вы­ра­жения в MySQL за­кан­чи­ва­ют­ся точ­кой с за­пя­той. Это часть син­так­си­са MySQL, а не SQL (ес­ли вы по­хо­жи на ме­ня, то бу­де­те по­сто­ян­но про эти точ­ки с за­пя­той за­бы­вать!).
  
 
Дру­гие SQL-за­про­сы и ко­ман­ды, ко­то­рые мы ви­де­ли ранее, мож­но за­пустить точ­но так же. Ес­ли вы сле­дуе­те за мной, на­де­юсь, вам за­хо­те­лось по­про­бо­вать вы­полнить несколь­ко соб­ст­вен­ных за­про­сов.
 
Дру­гие SQL-за­про­сы и ко­ман­ды, ко­то­рые мы ви­де­ли ранее, мож­но за­пустить точ­но так же. Ес­ли вы сле­дуе­те за мной, на­де­юсь, вам за­хо­те­лось по­про­бо­вать вы­полнить несколь­ко соб­ст­вен­ных за­про­сов.
 +
 +
===Ссы­лоч­ная це­ло­ст­ность===
 +
 +
Обыч­но с MySQL ис­поль­зу­ет­ся два сер­вер­ных движ­ка: MyISAM и InnoDB. В вер­си­ях MySQL до 5.5 в таб­ли­цах по умол­чанию ис­поль­зо­вал­ся MyISAM, а ес­ли вам нуж­на бы­ла таб­ли­ца InnoDB, это ука­зы­ва­лось при ее соз­дании. На­чи­ная с MySQL 5.5 и вы­ше, по умол­чанию при­ме­ня­ет­ся InnoDB. Од­но из пре­иму­ществ InnoDB – в при­ну­ди­тель­ном обес­пе­чении ссы­лоч­ной це­ло­ст­но­сти дан­ных.
 +
 +
«Ссы­лоч­ная це­ло­ст­ность» зву­чит весь­ма по-тех­нар­ски, но по су­ти это оз­на­ча­ет, что ес­ли внешний ключ су­ще­ст­ву­ет в таб­ли­це, этот ключ (в ви­де пер­вич­но­го клю­ча) дол­жен су­ще­ст­во­вать в таб­ли­це, на ко­то­рую ссы­ла­ет­ся внешний ключ. На­при­мер, ес­ли бы мы уда­ли­ли Джейн Смит из таб­ли­цы borrowers на­шей ба­зы дан­ных library, ссы­лоч­ная це­ло­ст­ность бы на­ру­ши­лась, по­то­му что ключ это­го поль­зо­ва­те­ля (102) указывается в таб­ли­це books.
 +
 +
По­сколь­ку на­ша ба­за дан­ных ис­поль­зу­ет дви­жок InnoDB и ссыл­ка внешнего клю­ча бы­ла объ­яв­ле­на в струк­ту­ре таб­ли­цы, при по­пыт­ке уда­лить Джейн Смит сис­те­ма веж­ли­во нам от­ка­жет:
 +
 +
mysql> delete from borrowers where name = ‘Jane Smith’;
 +
 +
ERROR 1451 (23000): Cannot delete or update a parent row:
 +
 +
a foreign key constraint fails (`library`.`books`,
 +
 +
CONSTRAINT `books_ibfk_1` FOREIGN KEY (`borrowerid`)
 +
 +
REFERENCES `borrowers` (`borrowerid`))
 +
 +
===Вре­мя для кое-че­го по­кра­си­вее===
 +
 +
Ес­ли вы уста­ли от команд­ной стро­ки и хо­ти­те уви­деть что-нибудь гра­фи­че­­ское, уста­но­ви­те MySQL Workbench. С этой про­грам­мой вы мо­же­те:
 +
 +
» Соз­да­вать схе­мы баз дан­ных, генери­ро­вать ба­зы дан­ных и управ­лять ими ви­зу­аль­но.
 +
 +
» Соз­да­вать, оп­ти­ми­зи­ро­вать и вы­пол­нять SQL-за­про­сы.
 +
 +
» На­страи­вать сер­ве­ры и учетные записи поль­зо­ва­те­лей.
 +
 +
» Пе­ре­но­сить ба­зы дан­ных с SQL Server, Sybase и PostgreSQL.
 +
 +
К со­жа­лению, ее нет в ре­по­зи­то­ри­ях CentOS, но ее мож­но за­гру­зить с сай­та MySQL. Сде­лай­те сле­дую­щее:
 +
 +
» Зай­ди­те на www.mysql.com/downloads.
 +
 +
» Щелкните по ссыл­ке MySQL Workbench.
 +
 +
» В вы­па­даю­щем спи­ске вы­бе­ри­те RedHat Linux 6.
 +
 +
» Щелкните по ссыл­ке для за­груз­ки 32-бит­ной или 64-бит­ной вер­сии.
 +
 +
» Щелкните по “No thanks, just start my download! [Нет, спа­си­бо, про­сто на­чать за­груз­ку!]”, что­бы про­пустить ре­ги­ст­ра­цию.
 +
 +
» Со­храните файл (он бу­дет в ва­шем ка­та­ло­ге Downloads).
 +
 +
» Ско­пи­руй­те файл в /tmp.
 +
 +
» Пе­ре­клю­чи­тесь на поль­зо­ва­те­ля root и вы­полните ко­ман­ды:
 +
 +
# yum install libzip pexpect gtkmm24
 +
 +
# rpm -i /tmp/mysql*rpm
 +
 +
Пер­вая ко­ман­да уста­но­вит требуемые за­ви­си­мо­сти па­ке­та, вто­рая – сам па­кет.
 +
 +
На эк­ран­ном сним­ке по­ка­зан про­смотр схе­мы ба­зы дан­ных в MySQL и ото­бра­жение ре­зуль­та­тов про­сто­го за­про­са. Уч­ти­те, что хо­тя MySQL – гра­фи­че­­ская про­грам­ма, вам все рав­но при­дет­ся на­би­рать свой SQL-за­прос! Мне осо­бен­но нра­вит­ся воз­мож­ность MySQL Workbench по «ре­ин­жинирин­гу» ба­зы дан­ных и по­строению ак­ку­рат­ной диа­грам­мы «сущ­ность – связь» со схе­ма­ми таб­лиц и от­но­шения­ми ме­ж­ду ними.
 +
 +
Че­рез ме­сяц, в по­следней час­ти се­рии, мы со­единим все час­ти сте­ка LAMP вме­сте. Мы раз­ра­бо­та­ем web-при­ло­жение, ко­то­рое по­зво­лит поль­зо­ва­те­лям биб­лио­те­ки от­прав­лять за­про­сы к ба­зе дан­ных биб­лио­те­ки че­рез HTML-фор­му, и на­пи­шем сер­вер­ный код на PHP, ко­то­рый вы­пол­ня­ет эти за­про­сы к ба­зе дан­ных и фор­ми­ру­ет ре­зуль­тат, от­фор­ма­ти­ро­ван­ный в HTML. Уви­дим­ся! |
  
 
===Ссы­лоч­ная це­ло­ст­ность===
 
===Ссы­лоч­ная це­ло­ст­ность===

Версия 05:38, 13 ноября 2018

Содержание

По рецептам доктора Брауна

Эзо­те­ри­че­ское сис­тем­ное ад­ми­ни­ст­ри­ро­ва­ние из при­чуд­ли­вых за­во­ро­тов ки­шок сер­вер­ной

ImageMagick

(thumbnail)
Д-р Крис Браун. Доктор обучает, пишет и консультирует по Linux. Ученая степень по физике элементарных частиц ему в этом совсем не помогает.

Рас­смот­рим ути­ли­ту, ко­то­рая де­ла­ет с изо­бра­же­ния­ми все, что ни по­же­ла­ешь, раз­ве что не ри­су­ет их.

Так как мой раз­дел по­свя­щен сис­тем­но­му ад­минист­ри­ро­ванию, то, ре­шив при­влечь ва­ше внимание к уди­ви­тель­но­му на­бо­ру ути­лит управ­ления изо­бра­жения­ми под на­званием ImageMagick, я немно­го сой­ду с лыжни. Идея о на­бо­ре ути­лит для ре­дак­ти­ро­вания изо­бра­жений, ра­бо­таю­щих чис­то в команд­ной стро­ке, мо­жет уди­вить да­же са­мых опыт­ных лю­би­те­лей Linux, но ImageMagick имен­но та­ков (хо­тя для неко­то­рых опе­ра­ций есть обо­лоч­ка в ви­де ме­ню).

От ши­ро­ты воз­мож­но­стей ImageMagick за­хва­ты­ва­ет дух. Хо­тя им нель­зя за­кра­сить на фо­то усы ва­шей те­щи, поч­ти со всем прочим он спра­вит­ся. Мож­но пре­об­ра­зо­вать изо­бра­жение в дру­гой фор­мат (под­дер­жи­ва­ет­ся бо­лее 100), пе­ре­ве­рнуть, от­ра­зить, мас­шта­би­ро­вать, об­ре­зать и транс­фор­ми­ро­вать изо­бра­жение, раз­мы­ть его и уве­ли­чить рез­кость, из­ме­нить цве­та, оп­ре­де­лить края, до­бавить текст и фи­гу­ры и мно­гое дру­гое.

Ох­ва­тить все воз­мож­но­сти ImageMagick все­го в несколь­ких при­ме­рах нель­зя, но вот два. Пер­вый соз­да­ет изо­бра­жение, со­дер­жа­щее текст, который располагается вдоль 360-гра­дусной ду­ги:

$ convert -background khaki -fill sienna -font acmesa.TTF -pointsize 144 label:”Ре­цеп­ты док­то­ра Брау­на. “ -distort Arc 360 arctext.png

Мой вто­рой при­мер соз­да­ет кол­лаж из ми­ниа­тюр всех изо­бра­же­ний, ко­то­рые есть в ка­та­ло­ге Pictures:

$ montage -label ‘%t\n%[width]x%[height]’ -size

512x512 ‘/home/chris/Pictures/*.jpg[120x90]’ -auto-orient -geometry +5+5 -tile 5x -frame 5 -shadow photos.png

Ре­зуль­тат – ак­ку­рат­ная се­рия миниа­тюр, каж­дая с за­го­лов­ком и в кра­си­вой рам­ке с те­нью. Эти при­ме­ры ил­лю­ст­ри­ру­ют ра­бо­ту толь­ко двух команд – convert и montage. Есть еще де­вять: animate, compare, composite, conjure, display, identify, import, mogrify и stream. В со­во­куп­но­сти у них столь­ко оп­ций и па­ра­мет­ров, что оша­ле­ет са­мый от­пе­тый нар­ко­ман команд­ной стро­ки. К сча­стью, на www.imagemagick.org очень мно­го го­то­вых при­ме­ров, по­кры­ваю­щих все: от раз­мы­тия до аф­фин­ных пре­об­ра­зо­ваний.

На­ря­ду с управ­лением ImageMagick из команд­ной стро­ки (или из скрип­та), есть биб­лио­те­ки, пре­достав­ляю­щие доступ ко все­му это­му ве­ли­ко­ле­пию для ра­бо­ты с изо­бра­жения­ми на язы­ках C, Java, Perl, PHP и Ruby. ImageMagick поч­ти на­вер­ня­ка есть в ва­шем ди­ст­ри­бу­ти­ве, и его уста­нов­ка долж­на быть про­стой. Существует вер­сия также и для Windows.

Стек LAMP

M – это MySQL. Тре­тья часть на­шей се­рии, и в ней мы ос­ваи­ва­ем ба­зы дан­ных.

В этом ме­ся­це мы рас­смот­рим «M» в сте­ке LAMP – MySQL. Спер­ва вкрат­це оз­на­ко­мим­ся с тео­ри­ей баз дан­ных, за­тем пе­рей­дем к SQL и, на­конец, уста­но­вим MySQL и соз­да­дим ба­зу дан­ных. Как и в пре­ды­ду­щих стать­ях, здесь я поль­зу­юсь CentOS 6.2 – и со­ве­тую вам по­сле­до­вать мо­ему при­ме­ру и уста­но­вить его на вир­ту­аль­ную ма­ши­ну.

По­со­бие по ныр­ку в ба­зы дан­ных

На то, что­бы стать гу­ру в ба­зах дан­ных, мож­но по­тра­тить всю жизнь, но осно­вы не слиш­ком слож­ны. Начнем с на­ча­ла: в ба­зах дан­ных ин­фор­ма­ция хранит­ся в таб­ли­цах, и у ка­ж­дой таб­ли­цы есть имя. Таб­ли­ца со­сто­ит из столб­цов и строк. У ка­ж­до­го столб­ца есть имя и тип дан­ных. Эти ти­пы дан­ных от­час­ти за­ви­сят от ис­поль­зуе­мо­го сер­ве­ра баз дан­ных, и необя­за­тель­но долж­ны на­пря­мую со­от­вет­ст­во­вать ти­пам дан­ных, ис­поль­зуе­мым в сер­вер­ных язы­ках про­грам­ми­ро­вания. На­при­мер, MySQL под­дер­жи­ва­ет 8-бит­ные це­лые чис­ла в ви­де ти­па TINYINT, ко­то­ро­го нет в PHP.

Один стол­бец внут­ри ка­ж­дой таб­ли­цы на­зна­ча­ет­ся пер­вич­ным клю­чом. Он дол­жен быть уника­лен внут­ри таб­ли­цы; ины­ми сло­ва­ми, за­про­сив дан­ные из таб­ли­цы для за­дан­но­го пер­вич­но­го клю­ча, вы по­лу­чи­те в от­вет мак­си­мум од­ну стро­ку. Так же час­то один или несколь­ко столб­цов со­дер­жат так на­зы­вае­мые внешние клю­чи, ко­то­рые пред­став­ля­ют со­бой пе­ре­кре­ст­ные ссыл­ки на пер­вич­ные клю­чи в дру­гих таб­ли­цах. Струк­ту­ра ба­зы дан­ных – ее таб­ли­цы, их столб­цы и ти­пы дан­ных и взаи­мо­свя­зи ме­ж­ду клю­ча­ми – на­зы­ва­ет­ся схе­мой ба­зы дан­ных.

Рас­смот­рим при­мер. На ри­сун­ке по­ка­за­ны две таб­ли­цы books [книги] и borrowers [чи­та­те­ли], ко­то­рые мо­гут со­ста­вить ба­зу дан­ных, ис­поль­зуе­мую биб­лио­те­кой, вы­даю­щей книги на дом. Ба­за дан­ных по­зво­ля­ет нам сле­дить за книга­ми в биб­лио­те­ке – вы­да­ны они или нет, и ес­ли да – кто их взял и когда вернет.

В таб­ли­це book ка­ж­дой книге на­зна­чен уникаль­ный иден­ти­фи­ка­тор книги; он вы­сту­па­ет в ро­ли пер­вич­но­го клю­ча таб­ли­цы. Мо­жет возник­нуть со­блазн ис­поль­зо­вать как пер­вич­ный ключ ISBN книги – в кон­це кон­цов, он обя­зан быть уникаль­ным. Но тогда в биб­лио­те­ке нель­зя бу­дет дер­жать боль­ше од­но­го эк­зем­п­ля­ра ка­ж­дой книги. Ис­поль­зо­вание соб­ст­вен­но­го «иден­ти­фи­ка­то­ра книги» в ка­че­­ст­ве пер­вич­но­го клю­ча по­зво­ля­ет из­бе­жать этой про­бле­мы. По­смот­рев на таб­ли­цу на ри­сун­ке, мы ви­дим, что од­ну из книг взял чи­та­тель 102. Это внешний ключ. 102 ссы­ла­ет­ся на пер­вич­ный ключ в таб­ли­це borrower. По­смот­рев в эту таб­ли­цу, мы ви­дим, что книгу взя­ла Джейн Смит [Jane Smith].

====Язык струк­тур­ных за­про­сов====Для соз­дания таб­лиц, вы­полнения к ним за­про­сов и их об­нов­ления ис­поль­зу­ет­ся древний язык под на­званием SQL (Structured Query Language – язык струк­ту­ри­ро­ван­ных за­про­сов). Он поя­вил­ся в 1974 го­ду и стал стан­дар­том ANSI в 1986, и этим силь­но от­ли­ча­ет­ся от всех про­чих язы­ков про­грам­ми­ро­вания, с ко­то­ры­ми вы мо­же­те быть зна­ко­мы. О нем на­пи­са­ны це­лые книги, но так как в этом ме­ся­це мне не вы­де­ли­ли всю пло­щадь жур­на­ла, при­дет­ся до­воль­ст­во­вать­ся несколь­ки­ми при­ме­ра­ми, что­бы вы по­ня­ли основ­ную идею.

Для на­ча­ла, вот па­ра SQL-за­про­сов:

select * from books where author = ‘Charles Dickens’

select author,title from books where onloan = 1

Ка­ж­дый из этих за­про­сов воз­вра­ща­ет «ре­зуль­ти­рую­щее мно­же­ст­во» – на­бор из ну­ля или бо­лее строк, со­дер­жа­щий со­от­вет­ст­вую­щие за­про­су за­пи­си. В пер­вом при­ме­ре * оз­на­ча­ет, что мы хо­тим по­лу­чить все столб­цы. По­смот­реть в таб­ли­цу, вы уви­ди­те, что мы по­лу­чим две стро­ки (так как Чарльз Дик­кенс на­пи­сал две из на­ших книг). Во вто­ром при­ме­ре в ре­зуль­та­тах нам нуж­ны толь­ко столб­цы author и title, и так как толь­ко од­на книга из таб­ли­цы вы­да­на на ру­ки, ре­зуль­тат бу­дет со­сто­ять из од­ной стро­ки.

Не все за­про­сы воз­вра­ща­ют стро­ки дан­ных. Сле­дую­щий за­прос воз­вра­тит про­сто ко­ли­че­­ст­во вы­дан­ных книг:

select count(*) from books where onloan = 1

Те­перь пред­по­ло­жим, что в биб­лио­те­ку по­сту­пи­ла но­вая книга. Вот SQL-за­прос для до­бав­ления но­вой стро­ки в таб­ли­цу:

insert into books values (6, ‘Birdsong’, ‘Sebastian Faulks’, 0, null, null)

Об­ра­ти­те внимание, что пер­во­на­чаль­но книга нико­му не вы­да­на. Клю­че­вое сло­во null оз­на­ча­ет, что эле­мен­ту не при­свое­но ника­ко­го зна­чения.

И вот на­ша биб­лио­те­ка ре­ши­ла из­ба­вить­ся от един­ст­вен­ной книги Ду­гла­са Адам­са [Douglas Adams] (по­зор!), и нам нуж­но уда­лить ее из ба­зы дан­ных сле­дую­щим SQL-за­про­сом:

delete from books where bookid = 4

Об­ра­ти­те внимание, что по­сколь­ку здесь мы вы­би­ра­ем дан­ные по пер­вич­но­му клю­чу, мы уда­лим мак­си­мум од­ну стро­ку. Дру­гой при­мер – ес­ли бы мы за­хо­те­ли уда­лить все книги Чарль­за Дик­кен­са [Charles Dickens] (еще худ­ший по­зор!), это мож­но бы­ло бы сде­лать так:

delete from books where author = ‘Charles Dickens’

На­конец, пред­ста­вим, что чи­та­тель Джон Доу [John Doe] со­об­щил биб­лио­те­ке об из­менении сво­его ад­ре­са, по­это­му нуж­но об­но­вить ба­зу дан­ных сле­дую­щим об­ра­зом:

update borrowers set address = ‘15 Lemon Street, Liverpool’ where name = ‘John Doe’

В этих при­ме­рах есть несколь­ко ве­щей, на ко­то­рые нуж­но об­ра­тить внимание. Во-пер­вых, клю­че­вые сло­ва SQL (вро­де select, where, insert и delete) я пи­сал в нижнем ре­ги­ст­ре. Это нор­маль­но, так как SQL не чув­ст­ви­те­лен к ре­ги­ст­ру; но боль­шин­ст­во рья­ных сто­ронников SQL на­пи­са­ли бы их за­глав­ны­ми бу­к­ва­ми. Во-вто­рых, здесь мы толь­ко смот­рим на вы­ра­жения язы­ка SQL. Да­лее на на­шем уро­ке мы уви­дим, как вы­пол­нять эти ко­ман­ды в кли­ен­те команд­ной стро­ки MySQL, а че­рез ме­сяц – из ко­да PHP, но по­ка это чис­тый SQL.

Бо­лее слож­ные за­про­сы

Пре­ж­де чем за­вер­шить на­ше мини-ру­ко­во­дство по SQL, мне хо­чет­ся по­ка­зать вам чуть бо­лее хит­рый за­прос. Пусть нам нуж­но вы­вес­ти спи­сок за­го­лов­ков книг и чи­та­те­лей для книг, вы­дан­ных на ру­ки. Эта ин­фор­ма­ция раз­би­та ме­ж­ду дву­мя таб­ли­ца­ми, по­это­му нам нуж­но объ­е­динить ре­зуль­та­ты из обе­их. За­прос вы­гля­дит следующим образом:

select books.title,borrowers.name from books,borrowers where books.onloan = 1 and books.borrowerid = borrowers.borrowerid ;

Об­ра­ти­те внимание, что те­перь име­на столб­цов нуж­но ука­зы­вать с име­на­ми таб­лиц, на­при­мер, books.title вме­сто про­сто title. Та­кой ти­па за­про­са на­зы­ва­ет­ся объ­е­динением. А в вы­ра­жении where – два усло­вия, со­единен­ные ло­ги­че­­ским «и (and)». Вто­рое усло­вие – books.borrowerid = borrowers.borrowerid – га­ран­ти­ру­ет, что мы по­лу­чим толь­ко те со­че­тания дан­ных из двух таб­лиц, ко­то­рые со­от­вет­ст­ву­ют од­но­му и то­му же взя­тию книги на ру­ки.

Здесь мы косну­лись SQL лишь в об­щих чер­тах. Мы не го­во­рили о ко­ман­дах соз­дания но­вых баз дан­ных и таб­лиц или о хранимых про­це­ду­рах – ко­то­рые по су­ти яв­ля­ют­ся име­но­ван­ны­ми фраг­мен­та­ми ко­да SQL, хранимы­ми на сер­ве­ре. Мы так­же во­все не упо­мя­ну­ли об управ­лении досту­пом. В MySQL есть до­воль­но тон­кая схе­ма управ­ления досту­пом, ко­то­рая по­зво­ля­ет соз­да­вать учет­ные за­пи­си поль­зо­ва­те­лей и за­тем ука­зы­вать, на­при­мер, что для за­дан­ных таб­лиц (или да­же за­дан­ных столб­цов таб­ли­цы) поль­зо­ва­тель име­ет пра­во толь­ко на чтение. У на­ше­го поль­зо­ва­те­ля root есть пол­ный доступ ко все­му, но вы вряд ли за­хо­ти­те ис­поль­зо­вать эту учет­ную запись в ре­аль­ном web-при­ло­жении. Да­вай­те уста­но­вим MySQL и вы­полним эти дей­ст­вия по-на­стоя­ще­му. MySQL есть в ре­по­зи­то­ри­ях CentOS, по­это­му уста­нов­ка про­ста:

yum install mysql mysql-server

Па­кет mysql-server со­дер­жит сам сер­вер (mysqld), а па­кет mysql (сре­ди про­че­го) – кли­ент команд­ной стро­ки MySQL, к ко­то­ро­му мы вско­ре пе­рей­дем.

Так­же есть обыч­ные ко­ман­ды управ­ления сер­ви­са­ми. Сна­ча­ла нуж­но обес­пе­чить за­пуск сер­ви­са при за­груз­ке сис­те­мы:

# chkconfig mysqld on

За­тем нуж­но за­пус­тить сер­вис пря­мо сей­час:

# service mysqld start

По­сле это­го вы­полните ко­ман­ду mysql_secure_installation для соз­дания на­чаль­ной кон­фи­гу­ра­ции. Это нуж­но сде­лать толь­ко один раз. У вас за­про­сят па­роль root, но на дан­ном эта­пе его еще нет, по­это­му про­сто на­жми­те Enter. За­тем вам пред­ло­жат за­дать но­вый па­роль root; за­дай­те хо­ро­ший на­деж­ный па­роль, по­то­му что у это­го поль­зо­ва­те­ля есть пол­ный ад­минист­ра­тив­ный кон­троль над всей ба­зой дан­ных. Правильнее будет назначить па­роль, от­лич­ный от па­ро­ля root в Linux. За­тем, сле­дуя ука­заниям про­грам­мы, вы долж­ны:

» Уда­лить аноним­ных поль­зо­ва­те­лей.

» От­клю­чить уда­лен­ный вход в сис­те­му от имени root.

» Уда­лить тес­то­вую ба­зу дан­ных.

Те­перь мож­но дви­гать­ся даль­ше. Мы пой­дем крат­чай­шим пу­тем, на­чав пря­мо с соз­дания ба­зы дан­ных library, ко­то­рой поль­зу­ем­ся в при­ме­рах. Для это­го восполь­зу­ем­ся го­то­вым скрип­том из команд SQL – createlibrary-database. Этот скрипт при­ве­ден на ри­сун­ке и так­же дол­жен быть на ва­шем дис­ке.

В команд­ной стро­ке MySQL этот скрипт за­пуска­ет­ся так:

$ mysql -u root -prootpw < create-library-database

Здесь rootpw – па­роль поль­зо­ва­те­ля root MySQL, ко­то­рого мы соз­да­ли ранее.

Ес­ли все прой­дет удач­но, соз­да­ст­ся ба­за дан­ных, и мы смо­жем вы­пол­нять вы­ше­опи­сан­ные за­про­сы. Зай­ди­те на сер­вер MySQL и вы­бе­ри­те ба­зу дан­ных library:

$ mysql -u root -prootpw library

MySQL на­пе­ча­та­ет не­сколь­ко строк со­об­ще­ний, за­тем ото­бра­зит стро­ку вво­да, из ко­то­рой и вы­пол­ня­ют­ся за­про­сы, на­при­мер:

mysql> select author,title from books where onloan = 1;

+---------------+--------------------+

| author | title |

+---------------+--------------------+

| Дж. K. Ро­улинг | Ку­бок Ог­ня |

+---------------+--------------------+

1 row in set (0.00 sec)

Об­ра­ти­те внимание, что вы­ра­жения в MySQL за­кан­чи­ва­ют­ся точ­кой с за­пя­той. Это часть син­так­си­са MySQL, а не SQL (ес­ли вы по­хо­жи на ме­ня, то бу­де­те по­сто­ян­но про эти точ­ки с за­пя­той за­бы­вать!).

Дру­гие SQL-за­про­сы и ко­ман­ды, ко­то­рые мы ви­де­ли ранее, мож­но за­пустить точ­но так же. Ес­ли вы сле­дуе­те за мной, на­де­юсь, вам за­хо­те­лось по­про­бо­вать вы­полнить несколь­ко соб­ст­вен­ных за­про­сов.

Ссы­лоч­ная це­ло­ст­ность

Обыч­но с MySQL ис­поль­зу­ет­ся два сер­вер­ных движ­ка: MyISAM и InnoDB. В вер­си­ях MySQL до 5.5 в таб­ли­цах по умол­чанию ис­поль­зо­вал­ся MyISAM, а ес­ли вам нуж­на бы­ла таб­ли­ца InnoDB, это ука­зы­ва­лось при ее соз­дании. На­чи­ная с MySQL 5.5 и вы­ше, по умол­чанию при­ме­ня­ет­ся InnoDB. Од­но из пре­иму­ществ InnoDB – в при­ну­ди­тель­ном обес­пе­чении ссы­лоч­ной це­ло­ст­но­сти дан­ных.

«Ссы­лоч­ная це­ло­ст­ность» зву­чит весь­ма по-тех­нар­ски, но по су­ти это оз­на­ча­ет, что ес­ли внешний ключ су­ще­ст­ву­ет в таб­ли­це, этот ключ (в ви­де пер­вич­но­го клю­ча) дол­жен су­ще­ст­во­вать в таб­ли­це, на ко­то­рую ссы­ла­ет­ся внешний ключ. На­при­мер, ес­ли бы мы уда­ли­ли Джейн Смит из таб­ли­цы borrowers на­шей ба­зы дан­ных library, ссы­лоч­ная це­ло­ст­ность бы на­ру­ши­лась, по­то­му что ключ это­го поль­зо­ва­те­ля (102) указывается в таб­ли­це books.

По­сколь­ку на­ша ба­за дан­ных ис­поль­зу­ет дви­жок InnoDB и ссыл­ка внешнего клю­ча бы­ла объ­яв­ле­на в струк­ту­ре таб­ли­цы, при по­пыт­ке уда­лить Джейн Смит сис­те­ма веж­ли­во нам от­ка­жет:

mysql> delete from borrowers where name = ‘Jane Smith’;

ERROR 1451 (23000): Cannot delete or update a parent row:

a foreign key constraint fails (`library`.`books`,

CONSTRAINT `books_ibfk_1` FOREIGN KEY (`borrowerid`)

REFERENCES `borrowers` (`borrowerid`))

Вре­мя для кое-че­го по­кра­си­вее

Ес­ли вы уста­ли от команд­ной стро­ки и хо­ти­те уви­деть что-нибудь гра­фи­че­­ское, уста­но­ви­те MySQL Workbench. С этой про­грам­мой вы мо­же­те:

» Соз­да­вать схе­мы баз дан­ных, генери­ро­вать ба­зы дан­ных и управ­лять ими ви­зу­аль­но.

» Соз­да­вать, оп­ти­ми­зи­ро­вать и вы­пол­нять SQL-за­про­сы.

» На­страи­вать сер­ве­ры и учетные записи поль­зо­ва­те­лей.

» Пе­ре­но­сить ба­зы дан­ных с SQL Server, Sybase и PostgreSQL.

К со­жа­лению, ее нет в ре­по­зи­то­ри­ях CentOS, но ее мож­но за­гру­зить с сай­та MySQL. Сде­лай­те сле­дую­щее:

» Зай­ди­те на www.mysql.com/downloads.

» Щелкните по ссыл­ке MySQL Workbench.

» В вы­па­даю­щем спи­ске вы­бе­ри­те RedHat Linux 6.

» Щелкните по ссыл­ке для за­груз­ки 32-бит­ной или 64-бит­ной вер­сии.

» Щелкните по “No thanks, just start my download! [Нет, спа­си­бо, про­сто на­чать за­груз­ку!]”, что­бы про­пустить ре­ги­ст­ра­цию.

» Со­храните файл (он бу­дет в ва­шем ка­та­ло­ге Downloads).

» Ско­пи­руй­те файл в /tmp.

» Пе­ре­клю­чи­тесь на поль­зо­ва­те­ля root и вы­полните ко­ман­ды:

  1. yum install libzip pexpect gtkmm24
  1. rpm -i /tmp/mysql*rpm

Пер­вая ко­ман­да уста­но­вит требуемые за­ви­си­мо­сти па­ке­та, вто­рая – сам па­кет.

На эк­ран­ном сним­ке по­ка­зан про­смотр схе­мы ба­зы дан­ных в MySQL и ото­бра­жение ре­зуль­та­тов про­сто­го за­про­са. Уч­ти­те, что хо­тя MySQL – гра­фи­че­­ская про­грам­ма, вам все рав­но при­дет­ся на­би­рать свой SQL-за­прос! Мне осо­бен­но нра­вит­ся воз­мож­ность MySQL Workbench по «ре­ин­жинирин­гу» ба­зы дан­ных и по­строению ак­ку­рат­ной диа­грам­мы «сущ­ность – связь» со схе­ма­ми таб­лиц и от­но­шения­ми ме­ж­ду ними.

Че­рез ме­сяц, в по­следней час­ти се­рии, мы со­единим все час­ти сте­ка LAMP вме­сте. Мы раз­ра­бо­та­ем web-при­ло­жение, ко­то­рое по­зво­лит поль­зо­ва­те­лям биб­лио­те­ки от­прав­лять за­про­сы к ба­зе дан­ных биб­лио­те­ки че­рез HTML-фор­му, и на­пи­шем сер­вер­ный код на PHP, ко­то­рый вы­пол­ня­ет эти за­про­сы к ба­зе дан­ных и фор­ми­ру­ет ре­зуль­тат, от­фор­ма­ти­ро­ван­ный в HTML. Уви­дим­ся! |

Ссы­лоч­ная це­ло­ст­ность

Обыч­но с MySQL ис­поль­зу­ет­ся два сер­вер­ных движ­ка: MyISAM и InnoDB. В вер­си­ях MySQL до 5.5 в таб­ли­цах по умол­чанию ис­поль­зо­вал­ся MyISAM, а ес­ли вам нуж­на бы­ла таб­ли­ца InnoDB, это ука­зы­ва­лось при ее соз­дании. На­чи­ная с MySQL 5.5 и вы­ше, по умол­чанию при­ме­ня­ет­ся InnoDB. Од­но из пре­иму­ществ InnoDB – в при­ну­ди­тель­ном обес­пе­чении ссы­лоч­ной це­ло­ст­но­сти дан­ных.

«Ссы­лоч­ная це­ло­ст­ность» зву­чит весь­ма по-тех­нар­ски, но по су­ти это оз­на­ча­ет, что ес­ли внешний ключ су­ще­ст­ву­ет в таб­ли­це, этот ключ (в ви­де пер­вич­но­го клю­ча) дол­жен су­ще­ст­во­вать в таб­ли­це, на ко­то­рую ссы­ла­ет­ся внешний ключ. На­при­мер, ес­ли бы мы уда­ли­ли Джейн Смит из таб­ли­цы borrowers на­шей ба­зы дан­ных library, ссы­лоч­ная це­ло­ст­ность бы на­ру­ши­лась, по­то­му что ключ это­го поль­зо­ва­те­ля (102) указывается в таб­ли­це books.

По­сколь­ку на­ша ба­за дан­ных ис­поль­зу­ет дви­жок InnoDB и ссыл­ка внешнего клю­ча бы­ла объ­яв­ле­на в струк­ту­ре таб­ли­цы, при по­пыт­ке уда­лить Джейн Смит сис­те­ма веж­ли­во нам от­ка­жет:

mysql> delete from borrowers where name = ‘Jane Smith’;

ERROR 1451 (23000): Cannot delete or update a parent row:

a foreign key constraint fails (`library`.`books`,

CONSTRAINT `books_ibfk_1` FOREIGN KEY (`borrowerid`)

REFERENCES `borrowers` (`borrowerid`))

Вре­мя для кое-че­го по­кра­си­вее

Ес­ли вы уста­ли от команд­ной стро­ки и хо­ти­те уви­деть что-нибудь гра­фи­че­­ское, уста­но­ви­те MySQL Workbench. С этой про­грам­мой вы мо­же­те:

» Соз­да­вать схе­мы баз дан­ных, генери­ро­вать ба­зы дан­ных и управ­лять ими ви­зу­аль­но.

» Соз­да­вать, оп­ти­ми­зи­ро­вать и вы­пол­нять SQL-за­про­сы.

» На­страи­вать сер­ве­ры и учетные записи поль­зо­ва­те­лей.

» Пе­ре­но­сить ба­зы дан­ных с SQL Server, Sybase и PostgreSQL.

К со­жа­лению, ее нет в ре­по­зи­то­ри­ях CentOS, но ее мож­но за­гру­зить с сай­та MySQL. Сде­лай­те сле­дую­щее:

» Зай­ди­те на www.mysql.com/downloads.

» Щелкните по ссыл­ке MySQL Workbench.

» В вы­па­даю­щем спи­ске вы­бе­ри­те RedHat Linux 6.

» Щелкните по ссыл­ке для за­груз­ки 32-бит­ной или 64-бит­ной вер­сии.

» Щелкните по “No thanks, just start my download! [Нет, спа­си­бо, про­сто на­чать за­груз­ку!]”, что­бы про­пустить ре­ги­ст­ра­цию.

» Со­храните файл (он бу­дет в ва­шем ка­та­ло­ге Downloads).

» Ско­пи­руй­те файл в /tmp.

» Пе­ре­клю­чи­тесь на поль­зо­ва­те­ля root и вы­полните ко­ман­ды:

  1. yum install libzip pexpect gtkmm24
  1. rpm -i /tmp/mysql*rpm

Пер­вая ко­ман­да уста­но­вит требуемые за­ви­си­мо­сти па­ке­та, вто­рая – сам па­кет.

На эк­ран­ном сним­ке по­ка­зан про­смотр схе­мы ба­зы дан­ных в MySQL и ото­бра­жение ре­зуль­та­тов про­сто­го за­про­са. Уч­ти­те, что хо­тя MySQL – гра­фи­че­­ская про­грам­ма, вам все рав­но при­дет­ся на­би­рать свой SQL-за­прос! Мне осо­бен­но нра­вит­ся воз­мож­ность MySQL Workbench по «ре­ин­жинирин­гу» ба­зы дан­ных и по­строению ак­ку­рат­ной диа­грам­мы «сущ­ность – связь» со схе­ма­ми таб­лиц и от­но­шения­ми ме­ж­ду ними.

Че­рез ме­сяц, в по­следней час­ти се­рии, мы со­единим все час­ти сте­ка LAMP вме­сте. Мы раз­ра­бо­та­ем web-при­ло­жение, ко­то­рое по­зво­лит поль­зо­ва­те­лям биб­лио­те­ки от­прав­лять за­про­сы к ба­зе дан­ных биб­лио­те­ки че­рез HTML-фор­му, и на­пи­шем сер­вер­ный код на PHP, ко­то­рый вы­пол­ня­ет эти за­про­сы к ба­зе дан­ных и фор­ми­ру­ет ре­зуль­тат, от­фор­ма­ти­ро­ван­ный в HTML. Уви­дим­ся! |

Персональные инструменты
купить
подписаться
Яндекс.Метрика