Моят личен и професионален живот

2018-05-15

MySQL Shell и автоматичното създаване на идентификтори за документи

Защо получавам грешка ERROR: 5115: Document is missing a required field в MySQL Shell 8.0.11 свързан към MySQL 5.7.22 сървър? Разгледайте следната сесия в която първо се свързвам към сървъра, създавам нова схема, след това колекция вътре в схемата и накрая се опитвам да създам документ без явно да предоставям идентификатор:

MySQL Shell 8.0.11

Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type '\help' or '\?' for help; '\quit' to exit.


MySQL JS> \connect root@server
Creating a session to 'root@
server'
Enter password: ************
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 1027578 (X protocol)
Server version: 5.7.22-log Source distribution
No default schema selected; type \use schema to set one.

MySQL [server+ ssl] JS> session.createSchema('test')
<schema:test>

MySQL [
server+ ssl] JS> \use test
Default schema `test` accessible through db.

MySQL [
server+ ssl/test] JS> per_coll = db.createCollection('persons')
<collection:persons>

MySQL [
server+ ssl/test] JS> per_coll.add({name:'Georgi'})
ERROR: 5115: Document is missing a required field

MySQL [
server+ ssl/test] JS> \py
Switching to Python mode...

MySQL [server+ ssl/test] Py> pcol = db.get_collection('persons')

MySQL [server+ ssl/test] Py> pcol.add({'name':'Georgi'})
ERROR: 5115: Document is missing a required field


В този случай MySQL Shell трябва да създаде идентификатор както е указано в наръчника (виж Наръчника за MySQL 5.7, глава 19.4.4.2 Add Documents), където е написано:
Each document requires an identifier field called _id. The value of the _id field must be unique among all documents in the same collection. If the document passed to the add() method does not contain the _id field, MySQL Shell automatically inserts a field into the document and sets the value to a generated universal unique identifier (UUID).
При свързване към MySQL 8.0 сървър няма такъв проблем:

MySQL Shell 8.0.11

Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type '\help' or '\?' for help; '\quit' to exit.


MySQL JS> \connect root@mysql8
Creating a session to 'root@mysql8'
Enter password: ************
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 6646 (X protocol)
Server version: 8.0.11 Source distribution
No default schema selected; type \use <schema> to set one.

MySQL [mysql8+ ssl] JS> session.createSchema('test')
<schema:test>

MySQL [mysql8+ ssl] JS> \use test
Default schema `test` accessible through db.

MySQL [mysql8+ ssl/test] JS> per_coll = db.createCollection('persons')
<collection:persons>

MySQL [mysql8+ ssl/test] JS> per_coll.add({name:'Georgi'})
Query OK, 1 item affected (0.2450 sec)


MySQL [192.168.79.46+ ssl/test2] JS> per_coll.find()
[
    {
        "_id": "00005adc69630000000000000002",
        "name": "Georgi"
    }
]
1 document in set (0.2035 sec)


Опитах също и с MySQL Shell 1.0 и отново няма проблем:

$ mysqlsh
MySQL Shell 1.0.11

Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type '\help' or '\?' for help; '\quit' to exit.

Currently in Python mode. Use \sql to switch to SQL mode and execute queries.
mysql-py> \connect root@localhost
Creating a Session to 'root@localhost'
Enter password:
Your MySQL connection id is 1028442 (X protocol)
Server version: 5.7.22-log Source distribution
No default schema selected; type \use <schema> to set one.
mysql-py> session.create_schema('test')
<schema:test>
mysql-py> \use test
Schema `test` accessible through db.
mysql-py> pcol = db.create_collection('persons')
mysql-py> pcol.add({'name':'Georgi'})
Query OK, 1 item affected (0.16 sec)
mysql-py> pcol.find()
[
    {
        "_id": "aa0960462c58e811b27610feed07afc3",
        "name": "Georgi"
    }
]
1 document in set (0.00 sec)


Публикацията MySQL Document Store Document IDs. на Dave Stokes е първия (и всъщност единствен) резултат в Google за грешката (при търсене за точно съвпадение с двойни кавички). Публикацията насочва към глава 5.1.1 Understanding Document IDs от X DevAPI User Guide, където четем:
X DevAPI relies on server based document ID generation, added in MySQL version 8.0.11, which results in sequentially increasing document IDs across all clients.
...
Whenever an _id field value is not present in an inserted document, the server generates an _id value.
Която изяснява проблема. Явно, MySQL Shell 8.0.11 очаква сървъра да създаде идентификатор (за колоната _id) без да взима в предвид дали той е версия 5.7 или 8.0, което за мен е бъг, който трябва да докладвам по-късно.

Обновяване 2018-05-16: Oracle провериха бъг доклада ми (виж bug 90876). Надявам се, че ще бъде оправен.

2018-05-01

Миграция към Git и GitHub

Преди няколко години реших да мигрирам всичките си лични проекти към разпределена система за контрол на версиите (РСКВ), но така и не намерих времето за това. В днешно време Git е де факто стандарт за контрол на версиите затова реших да мигрирам към Git и кача всичките си проекти в GitHub. Така че тази година постепенно ще мигрирам проектите си, започвайки с най-малко активните. Повечето от тях са все още на CVS, което прави миграцията по-сложна като се има в предвид, че CVS и Git са доста различни в много отношения, но също така защото за мен е важно да запазя историята на промените си (т.е. не искам просто да копирам кода и инициализирам ново Git хранилище вътре). Пожелайте ми успех и ми стискайте палци ;-)

2018-04-29

Излезе MySQL 8.0

Миналия четвъртък (19-ти Април) Oracle пусна MySQL 8.0.11 като General Availability (GA). Това е голяма нова версия, включваща много нови възможности, но любимите ми във връзка с разработка са Common Table Expressions (CTO), прозоречни функции, подобрения по регулярни зирази, NOWAIT и SKIP LOCKED за заключващи четения, функция GROUPING, низходящи индекси и разширена JSON функционалност. Обаче, има много повече в MySQL 8 най-вече транзакционен речник на данните, атомарни DDLи, роли, ресурсни групи, невидими индекси, хистограми и още много други. Има също така подобрения в производителността включващи Unicode, JSON и регулярни изрази.
Играя си с MySQL 8 откакто Release Candidate 1 беше пусната миналия Септември. Тогава инсталирах MySQL 8.0.3 (RC1) в Slackware виртуална машина и пуснах репликация от MySQL 5.7 сървъра ми, така че да мога да експериментирам с действителни данни. Като цяло съм ентусиазиран от новите функционалности за разработка, но мога да взема и още ако Oracle ги предостави :-)
Има няколко неща, които трябва да имате в предвид с MySQL 8.0:

  • нов плъгин за удостоверяване по подразбиране caching_sha2_password: Това беше първия "проблем" с който се сблъсках миналия Септември. Ако все още имате нужда да се свързвате по стария начин тогава трябва само да добавите следното в конфигурационния ви файл и рестартирате сървъра:

    default_authentication_plugin = mysql_native_password

    Виж също публикацията Migrating to MySQL 8.0 without breaking old application на Фредерик Дешан.
  • Плъгина MySQL X вече е разрешен по подразбиране (виж WL#11040): Ако мигрирате от MySQL 5.7 или предишна MySQL 8.0 версия (DMR или RC), тогава премахнете следната директива от конфигурационния ви файл, за да избегнете предупреждение в логовете:

    plugin-load-add = mysqlx.so
  • не е възможно да се надгради директно от предишна версия, която не е GA: Бях изненадан първоначално и дори регистрирах бъг (виж 90619) след като първо писах в Twitter, но след това си припомних предишните надграждания и осъзнах, че това е нормално за MySQL (виж MySQL Upgrade Strategies) независимо дали ми харесва или не. Надграждането от 5.7 до 8.0 официално се поддържа, но все още не съм го пробвал. Ще споделя опита си по-късно.
MySQL 8 е страхотна нова версия, която горещо ви приканвам да пробвате, защото предлага много нови функционалности част от съвременния SQL. Въпреки това очаквам, че приемането на новата версия ще отнеме известно време и ясен знак за това беше, че някои от новите JSON функционалности бяха приспособени към предишната GA версия (5.7.22).

    2018-03-04

    Как компилирам нови ядра за сървъра си

    Със скорошните Meltdown и Spectre критични уязвимости, трябваше да прекомпилирам ядрото за сървъра си доста често, затова установих следната процедура:

    1. Изтегляне на инкрементални пачове:

      for pn in `seq 115 118`; do
        wget "https://cdn.kernel.org/pub/linux/kernel/v4.x/incr/patch-4.4.${pn}-$((pn+1)).xz"
      done

    2. Разопаковане на пачовете:

      for pn in `seq 115 118`; do
        xz -d patch-4.4.${pn}-$((pn+1)).xz
      done

    3. Прилагане на пачовете:

      for pn in `seq 115 118`; do
        patch -p1 < patch-4.4.${pn}-$((pn+1))
      done

    4. Обновяване на конфигурацяита:

      make oldconfig

    5. Изграждане:

      time nice -+19 make

    Всичко това (освен стъпка 4) може да се автоматизира с един bash скрипт, но ми е мързеливо и затова го записвам тук за моя лична справка.

    2018-03-01

    Загубих телефона си :-(

    Вчера, загубих телефона си Samsung A5.2016. Обаче, "загубих" може би не е правилната дума в случая, защото това което всъщност направих е да го забравя в детската градина на най-малката ми дъщеря ОДЗ 188. Отидох там, за да присъствам на открит урок по хигиена и при влизането в залата се обаждах на жена ми. Тогава, оставих телефона на шкаф, за да мога да обуя калцуни, тъй като времето навън беше мокро и това беше. Обичайно не оставям телефона с просто така някъде, но вероятно бързах и бях разсеян. Забелязах липсата около час по-късно, когато прибирах дъщеря си вкъщи, но звънейки на номера си вече получавах съобщението "телефона е изключен или извън обхват" на оператора.
    Върнах се да търся телефона си, но вече го нямаше и никой не знаеше нищо. По-късно, през Facebook групата на групата на дъщеря ми в градината научих, че една от майките е забелязала телефона ми при излизане от открития урок, което значи, че е изчезнал някъде между 16:30 ч. EET и 16:45 ч. EET, защото когато си тръгвах не забелязах никакъв телефон на шкафа, а прибрах творбата на дъщеря ми от там. Не съм сигурен какво да си мисля, но просто не мога да проумея как телефона ми е бил взет от детска градина, където водя дъщеря си всеки работен ден. Вече съм отчаян, че ще успея да намеря телефона си, но все пак ще публикувам неговия IMEI и сериен номер тук, за тези които евентуално могат да открият, че техния телефон е бил откраднат (въпреки, че това не е сигурно, защото тези номера може вече да са били изтрити).
    Номерата на телефона

    Модел: SM-A510F
    IMEI: 352937/08/475020/4 (352937084750204)
    Сериен номер: R58H90EPAFM

    Както и да е, все още имам някаква надежда, че ще възстановя телефона си, така че ако попаднете на това съобщения и сте си купили телефон втора ръка наскоро, проверете го и ме уведомете ако информацията отгоре съвпада. Ще ви възнаградя ако данните са непокътнати!

    P.S. Между другото това е втория третия случай в който губя телефон за 9 12 години. Първия Последния път беше в един ресторант в Константа, Румъния през Август 2009 г. Телефона беше Nokia E65.


    Обновяване 2018-03-02 10:00 EET: Тази сутрин подадох жалба в полицията (7-мо РПУ в София).
    Обновяване 2018-03-07 08:00 EET: Както жена ми правилно ми направи забележка, това е всъщност третия път, в който губя телефона си. Първия път беше през Август 2005 на бензиностанция връщайки се от сватбата на една от братовчедките ми. Телефона беше Siemens C65.

    2018-02-26

    ReactOS 0.4.8 RC на VMware ESXi

    През почивните дни беше пусната ReactOS 0.4.8 RC. Успях да надградя и инсталирам също VMware Tools, но не можах да пусна мрежа с e1000 драйвера, така че продължих да ползвам vlance както е предложено на VMware страницата в ReactOS's Wiki. Също така имах BSOD с грешка 0xC0000218 отнасяща се до невъзможност да се прочете registry hive, което се оказа проблем с диска (виж тема Blue Screen crash on VirtualBox във ReactOS's форума).

    ReactOS Desktop

    Хвърлете един поглед и я пробвайте!

    2018-02-25

    Моите Линукс виртуални машини

    Аз съм Линукс потребител от 1999 и освен, че ползвам Slackware Linux най-много, използвам също други дистрибуции от време на време в работата си (напр. RadHat Linux сега Fedora, SuSE Linux сега OpenSuSE Leap) и личните ми проекти и експерименти (напр. Debian, Ubuntu, CentOS и други). През 2009 изградих виртуалния си сървър базиран на VMware ESXi hypervisor, с основната идея а мога да изграждам Slackware пакети за различни версии и двете архитектури - x86 и x86_64. Така, че текущо имам:

    И обнових всички тези (23+1) днес :-) Достъпвам тези виртуални машини през SSH и NoMachine (за работен плот). Бидейки човек с различни интереси използвам Oracle Express Edition 11g R2, MySQL, MariaDB и PostgreSQL бази от данни, различни приложения като Oracle SQL Developer, MySQL Workbench, PgAdmin III, Meld, kdesvn, Calibre и много други на тези виртуални машини. Отдолу са няколко екранни снимки: 

    Debian 9.3 (Stretch) Desktop
    Ubuntu 17.10 (Artful Aardvark) Desktop
    Fedora 27 Desktop
    openSUSE Leap 42.3 Desktop
    CentOS 7 Desktop

    Колко виртуални машини използвате у дома?

    2018-02-22

    Пак благодаря (че използваш цялото ми дисково пространство) Microsoft!

    Една виртуална машина с Windows 7, която търкалям редовно се чупи, защото дисковото пространство свършва.

    Графика на използваното дисково пространство
    Разследванията ми (с помощта на Disk Space Analyzer от Glary Utilities) разкриха, че това се дължи на:
    • CBS.log в C:\Windows\Logs\CBS нараства голям (напр. до няколко гига байта на моменти); и
    • отскоро папките C:\ProgramData\Microsoft\Microsoft Antimalware\Scans and C:\ProgramData\Microsoft\Microsoft Antimalware\Definition Updates нарастват големи (няколко гигабайта при последната проверка - виж графиката отгоре, която е от тази сутрин).
    Някой да знае лекарството за това (освен "не ползвай M$" и "не ползвай Windows Defender")?

    2018-02-17

    Преводи на Bugzilla 5.0.4 и 4.4.13

    Тъкмо се чудех какво става с разработката на Bugzilla, когато тази сутрин видях известието за  5.0.4 и 4.4.13 в пощенската си кутия. Тъй като беше Събота, започнах да обновявам преводите незабавно. Можете да ги изтеглите от обичайните места (за 5.0 и 4.4). Тези версии идват 1 година и 9 месеца след предишните, което намирам за доста странно (всички бъгове оправени за 5.0.4 - напр. 1273846, 1310728, 1301887 и 1303702 са докладвани преди 2 години, а някои от тях са оправени преди повече от година). И двете версии са били предизвикани от проблема със сигурността (виж бюлетина по сигурността, бъг 1433400 и CVE-2018-5123), но мисля, че това е най-дългия период без нова версия на Bugzilla в последните 12 години от както я превеждам.

    2017-11-20

    AVG Free Antivirus изтрива PowerShell скриптове

    Вчера, докато работех по моя PowerShell скрипт за резервни копия (виж проекта ми SPSB в GitHub) в една Windows 7 виртуална машина, забелязах странно поведение. Просто ей така скрипта биваше изтриван веднъж след като биваше изпълнен автоматично от Windows като Logoff или Shutdown скрипт зададен през Local Group Policy Editor. Затруднявах се да намеря обяснение на това сам или чрез търсене в Интернет тъй като нищо такова не се случваше на друга Windows 7 (физическа) машина в WAN мрежата ми (където скрипта всъщност беше предназначен да работи).
    Разбрах какво става след като брат ми работещ на същата виртуална машина ми писа по Hangouts, че получавал странни съобщения от AVG Free Antivirus за някакъв bak.ps1 скрипт, който бил поставян под карантина. Удари ме изведнъж, че това е скрипта над който работех и това обясни странно му изчезване от файловата система. Все още трябва да разбера какво точно в кода караше AVG да поставя под карантина файла със скрипта, но намирам за странно, че друго потребител получаваше съобщенията от AVG, а не потребителя с който работех.
    Ще обновя публикацията, когато разбера какво точно в скрипта беше взимано за заплаха от AVG.