bookmark_borderLMS migracja bazy danych z MySQL do PostgreSQL

LMS-PLUS udostępnia skrypt do konwersji Konwersja bazy danych LMS z MySQL na PostgreSQL, ale jest on dość wolny z uwagi na jednowątkowość. Co przy dużych bazach danych może być problemem.

W moim przypadku wybór padł na pgloader, który wykonał konwersję w 3 minuty, a nie 5h z wykorzystaniem w/w skryptu. Poniżej krótka relacja i moje wskazówki dla zainteresowanych.

Po latach użytkowania baza MySQL urosła i z różnych przyczyn zgromadziła wiele niespójnych danych. Najwięcej zabawy było z doprowadzeniem bazy MySQL do stanu, w którym pgloader nie raportował błędów. Sama konwersja jest bardzo szybka.

Dlaczego pgloader?

  1. Wykorzystuje wszystkie rdzenie, bo jest wielowątkowy.
  2. Kopiuje dane w locie z działającej bazy MySQL do PostgreSQL.
  3. pgloader uses the PostgreSQL COPY protocol which implements a streaming to send data in a very efficient way.

Napotkane problemy z MySQL:

ERROR: invalid byte sequence for encoding “UTF8”: 0x00

#sprawdzamy co tam w trawie piszczy
SELECT * FROM cash WHERE comment LIKE CONCAT("%", CHAR(0x00 using utf8), "%");

#jak coś znajdzie lepiej to poprawić przed konwersją np.:
UPDATE cash SET comment = REPLACE(comment,CHAR(0x00 using utf8),' ');
UPDATE cash SET comment = REPLACE(comment,'ł','Ł');

#sprawdzamy co tam w trawie piszczy
SELECT * FROM cashimport WHERE description LIKE CONCAT("%", CHAR(0x00 using utf8), "%")

#jak coś znajdzie lepiej to poprawić przed konwersją np.:
UPDATE cashimport SET description = REPLACE(description,CHAR(0x00 using utf8),' ');
UPDATE cashimport SET customer = REPLACE(customer,CHAR(0x00 using utf8),' ');

# ewentualnie jeszcze
UPDATE cashimport SET customer = REPLACE(customer,'Ł','Ł');
UPDATE cashimport SET customer = REPLACE(customer,'Ó','Ó');
UPDATE cashimport SET description = REPLACE(description,'Ł','Ł');
UPDATE cashimport SET description = REPLACE(description,'Ó','Ó');

Konwersja bazy to jedno, a potem trzeba modyfikować wszystkie dodatki i skrypty, jeżeli działały tylko w oparciu o bazę MySQL.

MySQLPostgreSQL
UNIX_TIMESTAMP()extract(epoch from now())
IF (passwd = ”, ‘mojehaslo’, passwd) AS valueCASE WHEN passwd IS NULL THEN ‘mojehaslo’ ELSE passwd END AS value
FROM_UNIXTIME(assignments.dateto)to_timestamp(assignments.dateto)
MONTH(to_timestamp(creationdate))EXTRACT(MONTH FROM customers.creationdate)

Przydatne linki:

http://www.sqlines.com/online

https://codebeautify.org/sqlformatter

https://mariadb.com/kb/en/setting-character-sets-and-collations/

https://github.com/kyob/lms-migracja-z-mysql-do-postgresql

bookmark_borderPROXMOX: create storage failed: error during cfs-locked ‘file-storage_cfg’

create storage failed: error during cfs-locked 'file-storage_cfg' operation: mkdir /mnt/pve/freenas_zfs_pool1/images: Permission denied at /usr/share/perl5/PVE/Storage/Plugin.pm line 1172. (500) OK

I tryied mount ZFS pool as NFS storage to Proxmox but got above error message.

Solution: Change directory rights on Truenas from 755 to 777.

bookmark_borderBitping – low resource consumption app to earn bitcoins

  1. Register on bitping.com
  2. Download bitping node
  3. Unzip downloaded file: unzip linux.zip; cd release
  4. Run server node and initiate credentials: ./bitping-node-amd64-linux -server

That’s all or go to next steps for more sophisticated installation.

#1
cd /etc/init.d
nano bitping.sh

#and paste it:

#!/bin/sh
cd /root/release # <= path to bitping
./bitping-node-amd64-linux -server
echo "Bitping started."

#2
nano /lib/systemd/system/bitping.service

# and paste it:
[Unit]
Description=Bitping
After=network.target
[Service]
User=root
WorkingDirectory=/root/bitping/ # <= path to bitping
ExecStart=/bin/sh /etc/init.d/bitping.sh
Restart=always
RestartSec=60
StandardOutput=inherit
StandardError=inherit
[Install]
WantedBy=multi-user.target

#3
systemctl enable bitping.service
systemctl start bitping.service
systemctl status bitping.service

bookmark_borderIGMP SNOOPING: report suppression

W przypadku, gdy do przełącznika mamy podłączone np. 100 STB jest duża szansa, że jakiś procent osób będzie chciał oglądać ten sam kanał.

Kiedy przykładowo 20 STB będzie odpytywać PIM o tą samą grupę multicastową (np. będzie transmisja na żywo z kolonizacji Marsa).

Przełącznik przetworzy 20 zapytań o grupę multicastową XXX i przekaże ją dalej do PIM, aby nie generować zbędnego ruchu do PIM przełącznik dzięku włączeniu report suppression ograniczy ilość zapytań do niezbędnego minimum.

bookmark_borderMariaDB (MySQL too?) issues with foreign keys

Federico Razzoli made good summary about Foreign Key bugs in MySQL and MariaDB

Useful links for MariaDB:

How to check if there are issues with foreign keys?

Just run command in DB console:

show engine innodb status

Example output for that command:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2021-01-29 18:53:28 7fe626b2c700 Transaction:
TRANSACTION 687228757, ACTIVE 0 sec inserting
mysql tables in use 104, locked 104
3 lock struct(s), heap size 1184, 1 row lock(s), undo log entries 1
MySQL thread id 980, OS thread handle 0x7fe626b2c700, query id 6632 localhost lms update
INSERT INTO invoicecontents (docid, itemid,
				value, taxid, taxcategory, prodid, content, count, pdiscount, vdiscount, description, tariffid)
				VALUES ('0', 2, '2', '2', 0, '', 'szt.', '1', '0', '0', 'Aktywacja Stb', NULL)
Foreign key constraint fails for table `lms`.`invoicecontents`:
,
  CONSTRAINT `invoicecontents_docid_fkey` FOREIGN KEY (`docid`) REFERENCES `documents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
Trying to add in child table, in index `docid` tuple:
DATA TUPLE: 2 fields;
 0: len 4; hex 80000000; asc     ;;
 1: len 6; hex 000002493403; asc    I4 ;;

But in parent table `lms`.`documents`, in index `PRIMARY`,
the closest match we can find is record:
PHYSICAL RECORD: n_fields 57; compact format; info bits 0
 0: len 4; hex 80000001; asc     ;;
 1: len 6; hex 0000278f14df; asc   '   ;;
 2: len 7; hex 14000001a730ce; asc      0 ;;
 3: len 1; hex 81; asc  ;;
 4: len 4; hex 80000001; asc     ;;
 5: len 4; hex 80000001; asc     ;;
 6: len 0; hex ; asc ;;
 7: len 4; hex cd1e6070; asc   `p;;
 8: len 4; hex 80000003; asc     ;;
 9: SQL NULL;
 10: len 15; hex 534f43484120437a6573c582617761; asc SOCHA Czes  awa;;
 11: len 28; hex 4b6170656c616ec3b37720576f6a736b6f77796368203132612f3138; asc Kapelan  w Wojskowych 12a/18;;
 12: len 6; hex 34342d313934; asc 44-194;;
 13: len 7; hex 4b6e7572c3b377; asc Knur  w;;
 14: len 0; hex ; asc ;;
 15: len 11; hex 3435303932333039333831; asc 45092309381;;
 16: len 2; hex 800e; asc   ;;
 17: len 1; hex 81; asc  ;;
 18: SQL NULL;
 19: len 0; hex ; asc ;;
 20: len 4; hex 80000001; asc     ;;
 21: SQL NULL;
 22: len 2; hex 8002; asc   ;;
 23: len 4; hex cd473ef0; asc  G> ;;
 24: len 30; hex 414c46412d53595354454d204d2e205069776f776172736b692c20412e20; asc ALFA-SYSTEM M. Piwowarski, A. ; (total 51 bytes);
 25: len 11; hex 4c6f746e696bc3b3772036; asc Lotnik  w 6;;
 26: len 7; hex 4b6e7572c3b377; asc Knur  w;;
 27: len 6; hex 34342d313936; asc 44-196;;
 28: len 4; hex 80000002; asc     ;;
 29: len 13; hex 3936392d31332d30382d303137; asc 969-13-08-017;;
 30: len 9; hex 323737383630383235; asc 277860825;;
 31: len 12; hex 383435343030303138303032; asc 845400018002;;
 32: len 0; hex ; asc ;;
 33: len 30; hex 572070727a797061646b752070797461c5842070726f73696d79206f206b; asc W przypadku pyta   prosimy o k; (total 61 bytes);
 34: len 0; hex ; asc ;;
 35: len 0; hex ; asc ;;
 36: len 10; hex 416c666153797374656d; asc AlfaSystem;;
 37: len 9; hex 312f30312f32303131; asc 1/01/2011;;
 38: len 2; hex 8000; asc   ;;
 39: len 1; hex 80; asc  ;;
 40: SQL NULL;
 41: SQL NULL;
 42: SQL NULL;
 43: SQL NULL;
 44: len 1; hex 80; asc  ;;
 45: SQL NULL;
 46: len 1; hex 80; asc  ;;
 47: SQL NULL;
 48: len 4; hex 80000000; asc     ;;
 49: len 2; hex 8000; asc   ;;
 50: len 3; hex 504c4e; asc PLN;;
 51: len 9; hex 800000010000000000; asc          ;;
 52: SQL NULL;
 53: len 4; hex 80000000; asc     ;;
 54: SQL NULL;
 55: len 4; hex 80000000; asc     ;;
 56: len 2; hex 8000; asc   ;;

How to temporary disable/enable foreign key check?

// disable
SET foreign_key_checks = 0
// enable
SET foreign_key_checks = 1

Foreign key check was the real case with issue https://github.com/chilek/lms-plus/issues/1645