Grant a privilege to zabbix user for "SHWO SLAVE STATUS"


If you can capture SQL Error Message, then you might see the message as below.

2017-01-01 01:01:01 zabbix[zabbix] @ localhost [] ERROR 1227: Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation : SHOW SLAVE STATUS


You can check the privileges as below.

SELECT USER, HOST, SUPER_PRIV, REPL_CLIENT_PRIV 

FROM mysql.user

WHERE USER = 'zabbix';


Then you need to update the privileges.

Method #1. GRANT. (Recommendation)

GRANT REPLICATION CLIENT ON *.* TO 'zabbix'@'localhost';

GRANT REPLICATION CLIENT ON *.* TO 'zabbix'@'127.0.0.1';


Method #2. UPDATE.

UPDATE mysql.user

SET

  REPL_CLIENT_PRIV = 'Y'

WHERE USER = 'zabbix';



Now, check the privileges again.

SELECT USER, HOST, SUPER_PRIV, REPL_CLIENT_PRIV 

FROM mysql.user

WHERE USER = 'zabbix';


That's it.

How to change MariaDB error log from syslog to separated log file


On my.cnf, you can see the message like this.

# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.


Therefore, if you want to see MariaDB error Log, then you need to check syslog.

For e.g.

$ cat /var/log/syslog | grep "mysql"

$ cat /var/log/syslog | grep "mariadb"


You can change the configuration to edit "/etc/mysql/conf.d/mysqld_safe_syslog.cnf".

$ sudo vi /etc/mysql/conf.d/mysqld_safe_syslog.cnf


[mysqld_safe]

skip_log_error

#syslog


Afterward, input the error log file on my.cnf.

$ vi /etc/mysql/my.cnf

log_error = /var/log/mysql/error.log


Restart MariaDB.


Reference.

https://mariadb.com/kb/en/mariadb/error-log/


How to fix unused shared library of user defined function error.

e.g. libmy_json_udf_path.so (json user function)


Error Messages on errorlog file.

[ERROR] Can't open shared library 'libmy_json_udf_path.so' (errno: 0, cannot open shared object file: No such file or directory)


Check mysql.func table.

select * from mysql.func;



Delete data on mysql.func and mysql.install_jsonudfs.

delete from mysql.func

where dl = 'libmy_json_udf_path.so';


DROP PROCEDURE IF EXISTS mysql.install_jsonudfs;


Restart MySQL(MariaDB).

https://dev.mysql.com/doc/refman/5.6/en/string-literals.html


Retrieve special character in MySQL.


ex.

DROP TEMPORARY TABLE IF EXISTS CharTest;

CREATE TEMPORARY TABLE CharTest

(value varchar(100));


INSERT INTO CharTest VALUES 

('ABXX'), ('ACYY'), 

('A%BXX'), ('A%CYY'), 

('A\\BXX'), ('A\\CYY'), 

('A''BXX'), ('A''CYY'),

('A/BXX'), ('A/CYY')

;


SELECT * FROM CharTest;

+-------+

| value |

+-------+

| ABXX  |

| ACYY  |

| A%BXX |

| A%CYY |

| A\BXX |

| A\CYY |

| A'BXX |

| A'CYY |

| A/BXX |

| A/CYY |

+-------+

10 rows in set (0.00 sec)


If you want to search data start with "A%".

It will not work properly as below.

SELECT * FROM CharTest where value like 'A%';

+-------+

| value |

+-------+

| ABXX  |

| ACYY  |

| A%BXX |

| A%CYY |

| A\BXX |

| A\CYY |

| A'BXX |

| A'CYY |

| A/BXX |

| A/CYY |

+-------+

10 rows in set (0.00 sec)



The result is exactly same data as start with "A".

So you need to use some escape sequence as below.

SELECT * FROM CharTest where value like 'A$%B%' ESCAPE '$';

+-------+

| value |

+-------+

| A%BXX |

+-------+

1 row in set (0.00 sec)


SELECT * FROM CharTest where value like 'A\\B%' ESCAPE '$';

+-------+

| value |

+-------+

| A\BXX |

+-------+

1 row in set (0.00 sec)


SELECT * FROM CharTest where value like 'A''B%';

+-------+

| value |

+-------+

| A'BXX |

+-------+

1 row in set (0.00 sec)


SELECT * FROM CharTest where value like 'A/B%';

+-------+

| value |

+-------+

| A/BXX |

+-------+

1 row in set (0.00 sec)


As you can see, "/" is not a special character.


##1. Concat String with delimiter

 GROUP_CONCAT


https://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html


ex.

DROP TABLE IF EXISTS group_concat_test;

CREATE TABLE group_concat_test

(

  SEQ INT NOT NULL AUTO_INCREMENT,

  CITY VARCHAR(20),

  PRIMARY KEY `pk_group_concat_test` (SEQ)

) ENGINE = MEMORY;


INSERT INTO group_concat_test (CITY) VALUES ('Luxembourg') ,('London'), ('Seoul'), ('Paris');


SELECT GROUP_CONCAT(CITY) AS ALL_CITY_NAMES

FROM group_concat_test;


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

| ALL_CITY_NAMES                |

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

| Luxembourg,London,Seoul,Paris |

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

1 row in set (0.00 sec)


SELECT GROUP_CONCAT(CITY SEPARATOR '#') AS ALL_CITY_NAMES

FROM group_concat_test;


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

| ALL_CITY_NAMES                |

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

| Luxembourg#London#Seoul#Paris |

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

1 row in set (0.00 sec)


SELECT GROUP_CONCAT(CITY ORDER BY CITY SEPARATOR '$') AS ALL_CITY_NAMES

FROM group_concat_test;


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

| ALL_CITY_NAMES                |

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

| London$Luxembourg$Paris$Seoul |

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

1 row in set (0.00 sec)


DROP TABLE IF EXISTS group_concat_test;



##2. Split String Array using specific delimiter


#Create a procedure and call.

DELIMITER $$

DROP PROCEDURE IF EXISTS usp_split_array_test$$

CREATE PROCEDURE usp_split_array_test(

  iValueArray   VARCHAR(100) # Input array value ex) 'value1, value2, value3'

  ,iDelimiter   CHAR(1)      # Delimiter

)

BEGIN

  DECLARE vValueArry VARCHAR(100);

  DECLARE vValue VARCHAR(10);

  DECLARE vDelimiter CHAR(1);

  

  SET vDelimiter := iDelimiter; #Variable for delimiter

  IF IFNULL(vDelimiter,'') = '' THEN

    SET vDelimiter := ',';

  END IF;

  

  SET vValueArry := iValueArray; #Variable for split work

  IF RIGHT(vValueArry,1) != vDelimiter THEN

    SET vValueArry := CONCAT(vValueArry,vDelimiter); # 'value1, value2, value3' --> 'value1, value2, value3,'

  END IF;

  

  DROP TEMPORARY TABLE IF EXISTS temp_split_array;

  CREATE TEMPORARY TABLE temp_split_array

  (

    SEQ INT NOT NULL AUTO_INCREMENT,

    VALUE VARCHAR(20),

    PRIMARY KEY `PK_temp_split_array` (SEQ)

  ) ENGINE = MEMORY;


  #SET @vValueArry := 'value1, value2, value3,'

  WHILE (LOCATE(vDelimiter, vValueArry) > 0)

  DO

      SET vValue := LEFT(vValueArry, LOCATE(vDelimiter,vValueArry) - 1);    

      SET vValueArry := SUBSTRING(vValueArry, LOCATE(vDelimiter,vValueArry) + 1);

      INSERT INTO temp_split_array (SEQ, VALUE)

      VALUES (null, vValue);

  END WHILE;


  SELECT * FROM temp_split_array;


  DROP TEMPORARY TABLE IF EXISTS temp_split_array;

END$$

DELIMITER ;


CALL usp_split_array_test('Luxembourg,London,Seoul,Paris', ',');


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

| SEQ | VALUE      |

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

|   1 | Luxembourg |

|   2 | London     |

|   3 | Seoul      |

|   4 | Paris      |

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

4 rows in set (0.00 sec)


CALL usp_split_array_test('Luxembourg;London;Seoul;Paris', ';');


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

| SEQ | VALUE      |

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

|   1 | Luxembourg |

|   2 | London     |

|   3 | Seoul      |

|   4 | Paris      |

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

4 rows in set (0.01 sec)






+ Recent posts