FastNetMon

Показаны сообщения с ярлыком MySQL. Показать все сообщения
Показаны сообщения с ярлыком MySQL. Показать все сообщения

среда, 11 апреля 2012 г.

Как посмотреть максимальный размер поля в MySQL?

Вот такой хитрой командой:
SELECT CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'table_name' AND table_schema = 'db_name' and column_name = 'column_name';

Источник: http://stackoverflow.com/questions/4990385/determine-max-length-allowed-in-a-column-in-mysql

четверг, 29 декабря 2011 г.

MySQL Memory storage: Dec 29 18:55:07 stat mysqld: 111229 18:55:07 [ERROR] /usr/sbin/mysqld: The table 'domains' is full

Подобная ошибка также может быть выдана ПО, осуществляющим добавление данных в MEMORY таблицу, так как кончилось место, зарезервированное под таблицы данного типа, чтобы исправить проблему, нужно увеличить лимит.

vim /etc/mysql/my.cnf

В блок [mysqld] добавляем:
max_heap_table_size=2048M

Перезапускаем СУБД:
/etc/init.d/mysql restart

среда, 21 декабря 2011 г.

Удобная работа с MySQL из Python посредством oursql

Зачем? Во-первых, MySQL DB в чистом виде черезчур аскетичен и нет таких удобных вещей как плейсхолдеров (параметризированных запросов), а без них работать с MySQL совершенно не камильфо. Модуль написан на C, так что не стоит бояться тормозов.

Ставим зависимости:
apt-get install -y libmysqlclient-dev python-mysqldb

Собираем oursql:
pip install oursql

Вот пример кода, которого достаточно для удобной работы с MySQL:
#!/usr/bin/python

import oursql
import stat_config

conn = oursql.connect(host='127.0.0.1', user='db_user', passwd='db_password', db='db_name')

# return rows as dicts
curs = conn.cursor(oursql.DictCursor)

# return row as arrays
# curs = conn.cursor()

curs.execute("SELECT * FROM domains WHERE domain_id = ? LIMIT ?", (1, 10))

for row in curs:
print row

Визуально, модуль работает не просто быстро, а ОЧЕНЬ быстро! Что очень радует!

Офсайт: http://packages.python.org/oursql/

понедельник, 19 декабря 2011 г.

Как собрать в MySQL таблице только уникальные данные?

Вот потребовалось собирать в таблице только уникальные данные. Причем, требуется, чтобы при добавлении значение, которое уже есть в таблице, новая запись просто игнорировалась. Как это сделать?

Очень просто - добавить для поля ограничение UNIQUE, а при использовании INSERT использовать конструкцию вида: INSERT IGNORE INTO ips (ip) VALUES('11.22.33.44'). При этом, не будет выдаваться ошибка при вставке значения, которое уже имеется в таблице, но и не будет осуществляться само добавление.

воскресенье, 18 декабря 2011 г.

Не работает LOAD DATA INFILE от рядового пользователя MySQL

При этом, от рута LOAD DATA INFILE работает отлично.

Как пофиксить? Нужно нашему пользователю дать дополнительные права:

grant file on *.* to db_user@localhost;
flush privileges;

вторник, 9 августа 2011 г.

MySQL: миграция с ENUM на VARCHAR

Перед началом работ необходимо сделать бэкап.

Итак, есть поле таблицы:
`status` enum('new','suspended','complete') default NULL,

Напрямую, насколько я понял, конвертировать его в VARCHAR нельзя. Поэтому пойдем по пути через промежуточное поле, создаем его:
alter table mod_ressrvlist add newstatus varchar(255) not null;

Итого, у нас теперь два поля в табоице:
`status` enum('new','suspended','complete') default NULL,
`newstatus` varchar(255) NOT NULL,

Итак, сейчас у нас следующее содержимое таблиц:
select status, newstatus from sometable;
+-----------+-----------+
| status | newstatus |
+-----------+-----------+
| new | |
| suspended | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| suspended | |
| new | |
| suspended | |
| suspended | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| new | |
| suspended | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
+-----------+-----------+

Копируем значения:
update sometable set newstatus = status;

Итого:
sql> select status, newstatus from mod_ressrvlist;
+-----------+-----------+
| status | newstatus |
+-----------+-----------+
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| suspended | suspended |
| new | new |
| suspended | suspended |
| suspended | suspended |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
+-----------+-----------+

После этого переименовываем старую таблицу:
ALTER TABLE sometable CHANGE status oldstatus enum('new','suspended','complete') default NULL;

Переименовываем новую в требуемое имя:
ALTER TABLE sometable CHANGE newstatus status varchar(255) NOT NULL;

Стираем старый филд с enum:
alter table sometable drop oldstatus;


Првоеряем новый тип поля:
`status` varchar(255) NOT NULL,

Делаем контрольную выборку:
select status from sometable;
+-----------+
| status |
+-----------+
| new |
| suspended |
| new |
| new |
| suspended |
| new |
| new |
| new |
| new |
| new |
| new |
| suspended |
| suspended |
| new |
| suspended |
| suspended |
| suspended |
| new |
| new |
| new |
| new |
| suspended |
| new |
| new |
| new |
| new |
| new |
| new |
| new |
| new |
| suspended |
| suspended |
| new |
| new |
| new |
| new |
| new |
| suspended |
| new |
| suspended |
| new |
| new |
| suspended |
| new |
| new |
+-----------+

Все! :)

MySQL - добавление нового значения в поле типа ENUM

Допустим, ранее было вот такое поле в некой таблице:
`status` enum('new','suspended') NOT NULL,

Но в один прекрасный момент понадобилось добавлять в этот самый enum что-то еще:
ALTER TABLEsome_table MODIFY status enum('new','suspended', 'complete')

Вуаля:
`status` enum('new','suspended','complete') default NULL,

Фишка тут еще в том, что новое значение нужно добавить в конец существующего списка:
Changing the definition of an ENUM or SET column by adding new enumeration or set members to the end of the list of valid member values, as long as the storage side of the data type does not change. For example, adding a member to a SET column that has 8 members changes the required storage per value from 1 byte to 2 bytes; this will require a table copy. Adding members in the middle of the list causes renumbering of existing members, which requires a table copy.

Источник: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

понедельник, 30 мая 2011 г.

Debian, MySQL 5.1 Perocna и работа с СУБД по tcp/ip сети: увеличивается Aborted_Connects

Имеем вот такой тестовый скрипт, запущенный на машине, которая подключается к удаленному MySQL серверу mysqlremoteserver.ru по сети:
for i in `seq 1 1000`; do echo -n "try $i"; mysqladmin ping -h mysqlremoteserver.ru -uv1 -pqwerty; if [ $? -ne 0 ]; then echo "not ok" ; fi ; done | grep -v 'alive'

И при запуске имеем следующие ошибки:
mysqladmin: connect to server at 'hostingmysqlserver' failed
error: 'Can't connect to MySQL server on 'hostingmysqlserver' (4)'
Check that mysqld is running on hostingmysqlserver and that the port is 3306.
You can check this by doing 'telnet hostingmysqlserver 3306'
try 12not ok
mysqladmin: connect to server at 'hostingmysqlserver' failed
error: 'Can't connect to MySQL server on 'hostingmysqlserver' (4)'
Check that mysqld is running on hostingmysqlserver and that the port is 3306.
You can check this by doing 'telnet hostingmysqlserver 3306'
try 199not ok
mysqladmin: connect to server at 'hostingmysqlserver' failed
error: 'Can't connect to MySQL server on 'hostingmysqlserver' (4)'
Check that mysqld is running on hostingmysqlserver and that the port is 3306.
You can check this by doing 'telnet hostingmysqlserver 3306'
try 201not ok
^Cmysqladmin: connect to server at 'hostingmysqlserver' failed
error: 'Can't connect to MySQL server on 'hostingmysqlserver' (4)'
Check that mysqld is running on hostingmysqlserver and that the port is 3306.
You can check this by doing 'telnet hostingmysqlserver 3306'


При этом увеличивается счетчик Aborted_connects:
show global status like 'Aborted%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 4 |
| Aborted_connects | 113 |
+------------------+-------+
2 rows in set (0.00 sec)

Как отладить данную проблему и понять, почему происходит сброс коннекта?

В первую очередь стоит включить лог предупреждений, это делается путем добавления в блок [mysqld] файла /etc/mysql/my.cnf ниже указанного параметра и последующей перезагрузки mysql демона:
log-warnings

После этого открываем лог mysql демона и ждем появления ошибок про Abort_connect:
tail -f /var/log/daemon.log -n 1000

Со временем должны появится примерно такие записи:
May 30 12:32:55 mysql1 mysqld: 110530 12:32:55 [Warning] Aborted connection 87982 to db: 'dbsome' user: 'tesuser' host: 'domain.ru' (Got an error reading communication packets)

По которым можно будет сделать хоть какие-то выводы о том, где источник проблемы.

понедельник, 22 ноября 2010 г.

Отличное решение для бэкапа баз данных на Percona Server 5.1 - xtrabackup

Ранее я писал о Percona Server - http://phpsuxx.blogspot.com/2010/10/percona-server-51-debian-5-lenny.html

А сейчас мне помогли обратить внимание на очень продвинутую тулзу для бэкапа MyISAM и InnoDB баз: http://www.percona.com/software/percona-xtrabackup/

Сравнить по пунктам с mysqldump пока не могу, но ожидайте :)

Вот сравнение с mysqldump при бэкапе-восстановлении больших баз: http://www.mysqlperformanceblog.com/2010/11/08/an-argument-for-not-using-mysqldump-in-production/

четверг, 11 ноября 2010 г.

Установка Confluence WIki на Debian 5 Lenny

Что это: http://www.atlassian.com/software/confluence/

Вот официальная инструкция по установке: http://confluence.atlassian.com/display/DOC/Confluence+Installation+Guide

Ставить будем в режиме EAR/WAR + Tomcat. Для начала ставим Tomcat: http://phpsuxx.blogspot.com/2010/11/apache-tomcat-55-debian-5-lenny.html

Следом поставим MySQL http://phpsuxx.blogspot.com/2009/12/mysql-debian5-lenny.html и создадим в ней пользователя и базу confluence с неким паролем.

Обращаю внимание, что MySQL нужно переконфигурировать следующим образом (источник):
vi /etc/mysql/my.cnf

И в блок [mysqld] добавить строку:
default-character-set=utf8

И применить изменения:
/etc/init.d/mysql restart

После этого нужно затюнить Tomcat, иначе настройки безопасности не дадут confluence запуститься:
vi /etc/default/tomcat5.5

И в самом низу добавляем:
TOMCAT5_SECURITY=no

Если же забыть это сделать, то в логах получим такой вот ужас и неработающий confluence:
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:56 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: start: Starting web application at '/confluence'
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:56 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: start: Starting web application at '/confluence'
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:56,819 INFO [http-8180-Processor25] [com.atlassian.confluence.lifecycle] contextInitialized Starting Confluence 3.4.1 (build #2030)
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:56,924 INFO [http-8180-Processor25] [beans.factory.xml.XmlBeanDefinitionReader] loadBeanDefinitions Loading XML bean definitions from class path resource [bootstrapContext.xml]
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,380 INFO [http-8180-Processor25] [beans.factory.xml.XmlBeanDefinitionReader] loadBeanDefinitions Loading XML bean definitions from class path resource [setupContext.xml]
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,421 INFO [http-8180-Processor25] [beans.factory.xml.XmlBeanDefinitionReader] loadBeanDefinitions Loading XML bean definitions from class path resource [bootstrapCacheContext.xml]
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,517 ERROR [http-8180-Processor25] [atlassian.confluence.setup.ConfluenceConfigurationListener] contextInitialized An error was encountered while bootstrapping Confluence (see below): #012Error creating bean with name 'com.atlassian.confluence.plugin.PluginsClassLoaderConfigurationListener' defined in class path resource [bootstrapContext.xml]: Cannot resolve reference to bean 'uberClassLoader' while setting bean property 'delegationClassLoader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uberClassLoader' defined in class path resource [bootstrapContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012org.springframework.beans.facto
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: ry.BeanCreationException: Error creating bean with name 'com.atlassian.confluence.plugin.PluginsClassLoaderConfigurationListener' defined in class path resource [bootstrapContext.xml]: Cannot resolve reference to bean 'uberClassLoader' while setting bean property 'delegationClassLoader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uberClassLoader' defined in class path resource [bootstrapContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uberClassLoader' defined in class path resource [bootstrapContext.xml]: Instantiation of bean failed; nested e
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: xception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012#011at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)#012#011at java.security.AccessController.checkPermission(AccessController.java:546)#012#011at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)#012#011at java.lang.SecurityManager.checkCreateClassLoader(SecurityMa
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: nager.java:594)#012#011at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:178)#012#011at java.lang.ClassLoader.(ClassLoader.java:226)#012#011at com.atlassian.confluence.util.ConfluenceUberClassLoader.(ConfluenceUberClassLoader.java:20)#012#011at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)#012#011at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)#012#011at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)#012#011at java.lang.reflect.Constructor.newInstance(Constructor.java:513)#012#011at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:85)#012#011at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:757)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanIns
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: tance(AbstractAutowireCapableBeanFactory.java:722)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:386)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)#012#011at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)#012#011at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:267)#012#011at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBea
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: nFactory.java:1100)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:862)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)#012#011at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)#012#011at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:248)#012#011at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:820)#012#011at org.springframework.context.support.
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: AbstractApplicationContext.registerListeners(AbstractApplicationContext.java:597)#012#011at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:349)#012#011at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:122)#012#011at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:76)#012#011at com.atlassian.confluence.setup.ConfluenceClassPathXmlApplicationContext.(ConfluenceClassPathXmlApplicationContext.java:26)#012#011at com.atlassian.confluence.setup.ConfluenceConfigurationListener.initialiseBootstrapContext(ConfluenceConfigurationListener.java:75)#012#011at com.atlassian.confluence.setup.ConfluenceConfigurationListener.contextInitialized(ConfluenceConfigurationListener.java:40)#012#011at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)#012#011at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)#012#011at org.apache.catalina.manager.M
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: anagerServlet.start(ManagerServlet.java:1173)#012#011at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:549)#012#011at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)#012#011at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)#012#011at java.lang.reflect.Method.invoke(Method.java:597)#012#011at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)#012#011at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)#012#011at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)#012#011at org.apache.catalina
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: .core.Ap
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: plicationFilterChain.internalDoFilter(ApplicationFilterChain.java:262)#012#011at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:192)#012#011at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:171)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)#012#011at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)#012#011at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)#012#011at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)#012#011at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)#012#011at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)#012#011at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)#012#011at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)#012#011at org.apach
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: e.coyote.http11.Http11Processor.process(Http11Processor.java:874)#012#011at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)#012#011at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)#012#011at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)#012#011at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)#012#011at java.lang.Thread.run(Thread.java:619)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,525 WARN [http-8180-Processor25] [atlassian.config.util.BootstrapUtils] getBootstrapManager Attempting to retrieve bootstrap manager before it is set up: com.atlassian.config.bootstrap.BootstrappedContextLoaderListener.canInitialiseContainer(BootstrappedContextLoaderListener.java:26)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,529 ERROR [http-8180-Processor25] [ContainerBase.[Catalina].[localhost].[/confluence]] listenerStart Exception sending context initialized event to listener instance of class com.atlassian.confluence.languages.ReloadBundlesContextListener#012java.security.AccessControlException: access denied (java.util.PropertyPermission confluence.i18n.reloadbundles read)#012#011at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)#012#011at java.security.AccessController.checkPermission(AccessController.java:546)#012#011at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)#012#011at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)#012#011at java.lang.System.getProperty(System.java:650)#012#011at java.lang.Boolean.getBoolean(Boolean.java:221)#012#011at com.atlassian.confluence.languages.ReloadBundlesContextListener.contextInitialized(ReloadBundlesContextListener.java:22)#012#011at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)#012#011at org.apache.catali
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: na.core.StandardContext.start(StandardContext.java:4216)#012#011at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1173)#012#011at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:549)#012#011at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)#012#011at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)#012#011at java.lang.reflect.Method.invoke(Method.java:597)#012#011at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)#012#011at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)#012#011at org.apache.c
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: atalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)#012#011at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:262)#012#011at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:192)#012#011at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:171)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)#012#011at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)#012#011at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)#012#011at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)#012#011at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)#012#011at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)#012#011at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 108)#012#011at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)#012#011at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)#012#011at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)#012#011at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)#012#011at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)#012#011at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)#012#011at java.lang.Thread.run(Thread.java:619)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,530 WARN [http-8180-Processor25] [atlassian.config.util.BootstrapUtils] getBootstrapManager Attempting to retrieve bootstrap manager before it is set up: com.atlassian.confluence.setup.ValidLicenseContextListener.shouldRunListener(ValidLicenseContextListener.java:48)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,530 WARN [http-8180-Processor25] [atlassian.config.util.BootstrapUtils] getBootstrapManager Attempting to retrieve bootstrap manager before it is set up: com.atlassian.confluence.upgrade.UpgradeLauncherServletContextListener.contextInitialized(UpgradeLauncherServletContextListener.java:22)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Error listenerStart
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Error listenerStart
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Context [/confluence] startup failed due to previous errors
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Context [/confluence] startup failed due to previous errors
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,532 INFO [http-8180-Processor25] [com.atlassian.confluence.lifecycle] contextDestroyed Stopping Confluence
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: list: Listing contexts for virtual host 'localhost'
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: list: Listing contexts for virtual host 'localhost'

Далее увеличиваем размер используемой памяти с 128 стандартных мегабайт до гигабайта (или как минимум 256 мегабайт):
vi /etc/default/tomcat5.5

JAVA_OPTS="-Djava.awt.headless=true -Xmx1024M -XX:MaxPermSize=192m"

Если же оставить стандартные 128, то confluence будет стопорится через раз с ошибкой "java.lang.OutOfMemoryError: Java heap space". Аналогично (офдокументация) с XX:MaxPermSize, у меня без указания явного выдавалась ошибка "jsvc.exec[27023]: Exception in thread "http-8180-Processor25" java.lang.OutOfMemoryError: PermGen space".

Теперь нужно скачать само приложение в формате EAR/WAR, открываем страницу http://www.atlassian.com/software/confluence/ConfluenceDownloadCenter.jspa, там выбираем Linux и щелкаем "Show all", из всего появившегося многообразия нам требуется "Confluence 3.4.1 - EAR/WAR (TAR.GZ Archive)", в данный момент прямая ссылка такая:
http://www.atlassian.com/software/confluence/downloads/binary/confluence-3.4.5.tar.gz

Скачиваем:
mkdir /opt/confluence_distrib
cd /opt/confluence_distrib
wget http://www.atlassian.com/software/confluence/downloads/binary/confluence-3.4.5.tar.gz
tar -xf confluence-3.4.5.tar.gz
cd confluence-3.4.5

Далее переходим к конфигурации:
vi /opt/confluence_distrib/confluence-3.4.5/confluence/WEB-INF/classes/confluence-init.properties

И добавляем там в самый низ:
confluence.home=/opt/confluence/

В этой папке confluence будет хранить все свои данные, не нужно указывать в ее качестве папку с дистрибутивом. Создаем ее:
mkdir /opt/confluence

Даем tomcat`у права на запись в нее:
chown tomcat55:root /opt/confluence

Теперь confluence нужно подключить к Tomcat, открываем конфиг:
vi /etc/tomcat5.5/Catalina/localhost/confluence.xml

И добавляем там следующее:
<Context path="/confluence" docBase="/opt/confluence_distrib/confluence-3.4.5/confluence" debug="0" reloadable="true">
</Context>

Если же Вы хотите, чтобы wiki была доступа по /, то прочтите следующее:
To run Confluence without a context path, change the path in the Context tag to an empty string (""). If not using a context path, your config will need to be saved as ROOT.xml rather than confluence.xml.

In Tomcat, a context path name follows the name of its xml file (except for ROOT.xml where no context path is used. Hence if you wish to change the context path to a different name, change both the context path and the name of the xml file. eg. "/wiki" context path should be saved in file wiki.xml.

То есть, если хотим, чтобы Confluence был доступен по /, то открываем файл:
vi /etc/tomcat5.5/Catalina/localhost/ROOT.xml

И добавляем в него:
<Context path="" docBase="/opt/confluence_distrib/confluence-3.4.5/confluence" debug="0" reloadable="true">
</Context>

Но при этом отвалится "Browse" - "Confluence Admin", это происходит из-за конфликта URL "/admin" админ-интерфейса Confluence c админкой TomCat:
HTTP Status 404 - /admin/console.action
type Status report
message /admin/console.action
description The requested resource (/admin/console.action) is not available.
Apache Tomcat/5.5

Пофиксить это можно отключением admin-интерфейса Tomcat:
mv /etc/tomcat5.5/Catalina/localhost/admin.xml /etc/tomcat5.5/Catalina/localhost/admin.old
/etc/init.d/tomcat5.5 restart

Открываем отладочный лог Tomcat:
tail -f /var/log/daemon.log

Перезапускаем Tomcat для применения настроек:
/etc/init.d/tomcat5.5 restart

Все, теперь заходим по адресу:
http://xx.xx.xx.xx:8180/confluence/

И там нас приветствует инсталлятор confluence и готовимся ввести регистрационные ключи. Далее выбираем "Production Install", External Database -> MySQL, далее выбираем тип соединения "Direct JDBC Connection". У нас язык русский, так что нам грозит использование UTF8, не забываем об этом при конфигурировании СУБД (также вписываем данные от ранее созданной базы):

Driver Class Name:
com.mysql.jdbc.Driver

Database URL:
jdbc:mysql://localhost/confluence?autoReconnect=true&sessionVariables=storage_engine%3DInnoDB&useUnicode=true&characterEncoding=utf8

После этого начинаем загрузку базы, далее выбираем "Example Site", чтобы забить вики тестовым контентом. Далее вписываем свои данные и начинаем разбираться во всей этой байде :)

Далее нужно немного разобраться с настройками. Указываем доменное имя: Browse, Confluence Admin, General Configuration, Edit и в поле "Server Base Url" вписываем доменное имя нашего сервера вместо IP.

Настройка почты. Browse, Confluence Admin, General Configuration, Mail Servers, Add a new SMTP mail server, SMTP Host Address: 127.0.0.1, from wiki@yourdomain.ru, Create.

воскресенье, 7 ноября 2010 г.

/etc/mysql/debian-start[xxx]: WARNING: mysql.user contains 2 root accounts without password!

Если Вы нашли нечто подобное в Debian, в daemon.log:
cat /var/log/daemon.log | grep mysql | grep WARNING

То все плохо :) То позаботьтесь о том, чтобы поставить всем своим рут пользователям пароли.

пятница, 5 ноября 2010 г.

Крайне интересным образом ISPManager выключает базы данных

select * from mysql.user where User = 'someuser';
| dsbl_localhost | someuser | *q1wqeqweqwe | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 |


То есть, вместо localhost клиенту прописывается Host dsbl_localhost, чтобы он ну никак не мог получить доступ, что же, годный метод. Поиск по интернетам также результатов не дал, видимо, "красивых" решений этой проблемы не существует. Вот даже фич риквест в баг-трекере MySQL: http://bugs.mysql.com/bug.php?id=9736

суббота, 30 октября 2010 г.

Миграция с MySQL 5.0 на MySQL 5.1 (Debian)

Итак, у нас имеется /var/lib/mysql от mysql 5.0 (5.0.8x-percona-bxx), а также работающий сервер с MySQL 5.1 (5.1.5x Percona Server). Задача - корректно перенести все данные на 5.1.

Для начала просто положим папку /var/lib/mysql от 5.0 в соответствующую папку от 5.1. Далее прежде чем запустить СУБД обратим внимание на то, что в Debian есть такой прекрасный скрипт как /etc/mysql/debian-start, который делает ряд нужных нам задач: upgrade_system_tables_if_necessary (апгрейд таблиц, нам как раз и нужна эта фича, она запускает скрипт /usr/bin/mysql_upgrade, которая, во-первых, обновляет структуру самих таблиц, а, во-вторых, вносит изменения в системные таблицы), check_root_accounts, check_for_crashed_tables (проверка всех MyISAM таблиц на консистентость). Но для работы этому скрипту нужны доступы к mysql с root привилегиями, которые обеспечиваются файлом /etc/mysql/debian.cnf, который необходимо перенести со старой машины (либо просто руками скопировать root пароль).

После этой подготовки запускаем СУБД и около получаса-часа ее не трогаем, пока она занимается апдейтом таблиц:
/etc/init.d/mysql start

Запрос для затравки: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=migrate+from+5.0+to+5.1+/var/lib/mysql

http://forums.mysql.com/read.php?10,323658,352152#msg-352152

вторник, 26 октября 2010 г.

Перенос MySQL баз данных на отдельные жесткий диск в CentOS

Пусть нужно перенести MySQL на новый SSD диск /dev/sdc.

Ставим parted (CentOS):
yum install -y parted

Ставим parted (Debian):
apt-get install -y parted

Создаем 1 раздел на новом диске:
parted /dev/sdc mklabel msdos
parted /dev/sdc mkpart primary ext3 0 100%

Форматируем его:
mkfs.ext3 /dev/sdc1

Гасим MySQL (CentOS):
/etc/init.d/mysqld stop

Гасим MySQL (Debian):
/etc/init.d/mysql stop

Убеждаемся, что MySQL отключился:
ps aux | grep mysql -i

Монтируем новый диск:
mount /dev/sdc1 /mnt
Копируем все файлы базы на него:
cp -aR /var/lib/mysql/* /mnt

Отмонтируем новый диск:
umount /mnt

Переносим MySQL с основного диска в бэкап папку:
mv /var/lib/mysql /var/lib/mysql_old

Создаем папку для постоянного монтирования нового жесткого диска:
mkdir /var/lib/mysql

Добавляем в fstab следующее:
/dev/sdc1 /var/lib/mysql ext3 defaults 0 0

Монтируем:
mount -a

Убеждаемся, что монтирование произведено корректно:
mount | grep sdc
/dev/sdc1 on /var/lib/mysql type ext3 (rw)

Далее меняем права на уже смонтированный диск:
chown mysql:mysql /var/lib/mysql
chmod 755 /var/lib/mysql

Запускаем MySQL (CentOS):
/etc/init.d/mysqld start

Запускаем MySQL (Debian):
/etc/init.d/mysql start

Все, теперь MySQL работает с нового жесткого диска :)