Category Archives: sadmin

sadmin

MySQL Кратко ръководство

MySQL е много бърза, стабилна система за управление на релационни бази данни (Relational Management Systems- RDBMS). Базата данни позволява ефективно съхранение, претърсване, сортиране и извличане на данни. MySQL контролира достъпа до вашите данни и позволява едновременна работа на множество потребители, бърз достъп, както и осигуряване на достъп само на оторизираните за това потребители. …

Цялата статия

PS: Готин домейн за дрехи: dreha.bg

 

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

vim трик

Идеята е да се премахнат всички празни редове:

g/^\s*$/d

Друг трик е да се премахне всичко след конкретен символ. Примерно имам следния ред:" Мартин Петров (Мартин" и желая да премахна всичко след "(":

%s/ (.*/

 

 

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Откриване на наличните dhcp сървъри в мрежата

Идеята е да се открият какви dhcp сървъри има в мрежата.

dhcping -s 255.255.255.255 -r -v

Got answer from: 172.16.2.2
received from 172.16.2.2, expected from 255.255.255.255
Got answer from: 172.16.2.2
received from 172.16.2.2, expected from 255.255.255.255
no answer

Тук става ясно, че има един -- 172.16.2.2

 

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Godaddy промокод fb30tld

ПРОМОКОД : fb30tld

Промокод за Godaddy валиден до  8/15/2011 г.

Намаляване на цената с 30% при  закупване на следните домейни от Godaddy:

.COM, .NET, .ORG, .BIZ, и .US

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Mysql replication slave -- Could not initialize master info structure

При change master на mysql slave  излиза следната грешка съпроводена с решение :) :

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST='192.193.123.4', MASTER_USER='slaveuser', MASTER_PASSWORD='pass', MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=49869;
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST='192.193.123.4', MASTER_USER='slaveuser', MASTER_PASSWORD='pass', MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=49869;
Query OK, 0 rows affected (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Режим само за четене в mysqld

Идяета е да се стартира mysqld които да предлага само четене без запис. Това е подходящо за репликиращи схеми и други.

Първи метод :
1.1

Със Superuser т.е. root сетвамее read_only=1 или read_only=yes

mysql-h localhost-u root-p
set GLOBAL read_only = true;

Със нормален потребител притежаващ пълни права върху конкретна база изпълняваме следната заявка:

mysql> insert into x (c) values ('test_mysql_read_only_by_amri');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

За да активираме write правата на всеки нормален потребител(изключение е само root):

mysql-h localhost-u root-p
set GLOBAL read_only = false;

1.2
Във файл /etc/mysql/my.cnf и по- точно в секция [mysqld] се добавя:

[mysqld]
read_only=1

/etc/init.d/mysql restart;

Втори метод за заключване на таблиците само за четене:

2.1
Отварят се две конзоли свързани към mysql. На втората се изпълнява(заключваме):

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)

На първата конзола която също е свързана към mysql се прави опит за INSERT , но не става :)

За да се активира отново на втората конзола се изпълнява:

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

mysql-proxy + memcached -- Инсталиране и конфигуриране

Идеята е да се обедини mysql-proxy + memcache. Защо ?
Защото искам всяка select заявка да се кешира в memcache. Ако не е кеширана да я кешира и при следващо извикване да я извлича от memcache.

Защо не се пусне само memcache и от самото php да се свързва към memcache демона ?

Защото по този метод (разгледана в публикацията) не се налага да се променя кода на писане т.е. просто се php приложението се свързва към localhost:4040 вместо към localhost (порта 4040 може да бъде променян разбира се, дори и на 3306 )

aptitude install lua5.1 liblua5.1-md5-0 liblua5.1-socket2 luarocks memcached mysql-proxy
mkdir /tmp/mysql-proxy-memcache-temp;
cd /tmp/mysql-proxy-memcache-temp;

wget http://luaforge.net/frs/download.php/4041/liblua5.1-memcached0.deb
wget http://luamemcached.googlecode.com/files/liblua5.1-memcached0.deb

wget http://luarocks.org/releases/luarocks-2.0.4.1.tar.gz

tar zxvf luarocks-2.0.4.1.tar.gz

./configure
make
make install;

luarocks install md5

cd /tmp/mysql-proxy-memcache-temp;
wget http://luaforge.net/frs/download.php/4542/luamemcached.0.7.tar.gz
tar xzvf luamemcached.0.7.tar.gz
mv *.lua /usr/local/share/lua/5.1/
luarocks install luasocket

cp mysql-proxy-cache.lua /usr/share/mysql-proxy/

mysql-proxy --proxy-lua-script=/usr/share/mysql-proxy/mysql-proxy-cache.lua

Код на mysql-proxy-cache.lua :

require('luarocks.require')
require('md5')
require('Memcached')
local memcache = Memcached.Connect()
cache_hits = 0
cache_misses = 0
cache_timeout = 30
function is_query(packet)
return packet:byte() == proxy.COM_QUERY
end

function is_cacheable(query)
return query:sub(1,6):lower() == 'select'
end

function to_hash(query)
db = proxy.connection.client.default_db
return md5.sumhexa(query..'db'..db)
end

function cache_get(query)
db = proxy.connection.client.default_db
local result = deserialize(memcache:get(to_hash(query)))
if result then
print('HIT: '..to_hash(query)..' ('..query..') DB:'..db)
cache_hits = cache_hits + 1
else
print('MISS: '..to_hash(query)..' ('..query..') DB:'..db)
cache_misses = cache_misses + 1
end

print('Cache hit ratio: '..cache_hits..'/'..cache_misses..' = '..cache_hits/cache_misses..' DB:'..db)

return result
end

function cache_set(result_packet)
local resultset_is_needed = false
local query = result_packet.query:sub(2)
local field_count = 1
local fields = result_packet.resultset.fields
local resultset = {rows={}, fields={}}

print('SET: '..to_hash(query)..' ('..query..')')

while fields[field_count] do
local field = fields[field_count]
--added third option, expiry time.
table.insert(resultset.fields, {type=field.type, name=field.name} )
field_count = field_count + 1
end

for row in result_packet.resultset.rows do
table.insert(resultset.rows, row)
end

memcache:set(to_hash(query), serialize(resultset), cache_timeout)
end

function serialize(o)
local result = {}
local o_type = type(o)

if o_type == "number" then
table.insert(result, o)

elseif o_type == "string" then
table.insert(result, string.format("%q", o))

elseif o_type == "table" then
table.insert(result, "{")
for key, value in pairs(o) do
for i, str in pairs({"[", serialize(key), "]=",
serialize(value), ","}) do
table.insert(result, str)
end
end
table.insert(result, "}")

elseif o_type == "nil" then
table.insert(result, "nil")

else
error("cannot serialize a " .. o_type)
end

return table.concat(result, ")
end

function deserialize(s)
if s then
return loadstring('return '..s)()
else
return nil
end
end

function read_query( packet )
if is_query(packet) then
local query = packet:sub(2)

if is_cacheable(query) then
local resultset = cache_get(query)
if resultset then
--- Cache hit
proxy.response.type = proxy.MYSQLD_PACKET_OK
proxy.response.resultset = resultset

return proxy.PROXY_SEND_RESULT
else
--- Cache miss
proxy.queries:append(1, packet,{resultset_is_needed = true})

return proxy.PROXY_SEND_QUERY
end
end
end
end

function read_query_result(result_packet)
--- This only gets called if the proxy.queries queue is modified
cache_set(result_packet)
end

PS: Нямах намерение да пиша тази публикация, но я написах защото Благо беше казал, че ще му бъде интересно това решение. Ето Благо,  специално за теб :P

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)