Duas maneiras possíveis. O primeiro é mais fácil, mas não testado:
Modo fácil: instale uma versão suportada e atualize para uma versão não suportada
O erro neste caso ocorre durante uma instalação clean de uma versão não suportada do MySQL. Ocorre ao executar o comando emerge --config
, que é executado após uma instalação limpa, em oposição a uma atualização. Portanto, a solução mais fácil é provavelmente primeiro instalar uma versão antiga e suportada do MySQL do repositório principal; em seguida, atualize-o para a versão posterior sem suporte da sobreposição. Então:
$ emerge --ask --verbose dev-db/mysql
Verifique se ele pede para instalar uma versão suportada. Deixe-o funcionar e conclua a instalação conforme as instruções:
$ emerge --config =dev-db/mysql-SUPPORTED.VERSION
Agora, desmascare a versão posterior sem suporte do repositório de sobreposições e atualize para ela:
$ emerge --ask --verbose dev-db/mysql
Verifique a versão que oferece e, novamente, deixe-a ser executada. Isso deve funcionar, embora eu não tenha testado; em vez disso eu fiz da maneira mais difícil.
Dificuldade: sobrescreva o eclass e lide com os erros
O manual do desenvolvedor diz , 'Se um ebuild define uma função que é exportada, isso recebe prioridade sobre qualquer versão eclass. Isso pode ser usado para substituir os padrões definidos pelo eclass ’. Então copie mysql-5.7.12.ebuild do ' mysql 'overlay a sua sobreposição local (prioridade +1000 no meu caso) e modificá-la lá, acrescentando a substituição:
pkg_config() { # test override of mysql-multilib-r1_pkg_config
die "ebuild override works!";
}
Verifique se o Portage executará a ebuild:
$ equery which dev-db/mysql
/usr/local/portage/dev-db/mysql/mysql-5.7.12.ebuild
Então teste:
$ emerge --ask --unmerge dev-db/mysql
$ rm --recursive /var/lib/mysql/* # clean away any remnants
$ emerge --ask --verbose dev-db/mysql
⋮ # waiting while it compiles …
$ emerge --config =dev-db/mysql-5.7.12
Com certeza, ele morre com a mensagem "ebuild override works!".
Agora, se você editar o arquivo ebuild
para fazer algo mais útil do que morrer e, em seguida, refazer o último comando acima, verá que ele ainda morre com a mesma mensagem. O cache do Portage continua sendo um problema. Mas como esse é um arquivo ebuild
, não um eclass
, e como ele está em sua própria sobreposição local, você pode trabalhar facilmente com o cache usando as revisões ebuild
adequadas:
$ pwd
/usr/local/portage/dev-db/mysql
$ cp mysql-5.7.12.ebuild mysql-5.7.12-r1.ebuild
E no arquivo de revisão mysql-5.7.12-r1.ebuild
, edite pkg_config
para implementar a correção real:
pkg_config() { # modified from mysql-multilib-r1.eclass
# of http://gpo.zugaina.org/Overlays/mysql
einfo "Overriding mysql-multilib-r1_pkg_config from this ebuild"
⋮
# initialize_options="--initialize-insecure '--init-file=${sqltmp}'" # fix:
initialize_options="--initialize-insecure --init-file=${sqltmp} "
⋮
}
Em seguida, teste novamente:
$ rm --recursive /var/lib/mysql/* # clean away any remnants
$ emerge --ask --verbose dev-db/mysql
⋮ # waiting while it recompiles …
$ emerge --config =dev-db/mysql-5.7.12-r1
Aqui acontece que pkg_config
ainda tem erros:
[ERROR] Failed to open the bootstrap file /var/tmp/portage/ … tmp.PD6hqOe8kA
[ERROR] 1105 Bootstrap file error, return code (0). Nearest query: …
Provavelmente são permissões de arquivo. De qualquer forma, funciona se você executar novamente o comando com falha como root:
$ /usr/sbin/mysqld --basedir=/usr \
--loose-skip-grant-tables --loose-skip-host-cache --loose-skip-name-resolve \
--loose-skip-networking --loose-skip-slave-start --loose-skip-ssl \
--loose-skip-log-bin --loose-skip-relay-log --loose-skip-slow-query-log \
--loose-skip-external-locking --loose-skip-log-slave-updates \
--user=mysql --datadir=/var/lib/mysql --tmpdir=/tmp/ --initialize-insecure \
--init-file=/var/tmp/portage/dev-db/mysql-5.7.12-r1/temp/tmp.PD6hqOe8kA
Em seguida, continue interpretando e executando manualmente o código Python:
$ chown -R mysql:mysql /var/lib/mysql
$ chmod 0750 /var/lib/mysql
$ /usr/sbin/mysqld
--loose-skip-grant-tables --loose-skip-host-cache --loose-skip-name-resolve \
--loose-skip-networking --loose-skip-slave-start --loose-skip-ssl \
--loose-skip-log-bin --loose-skip-relay-log --loose-skip-slow-query-log \
--loose-skip-external-locking --loose-skip-log-slave-updates \
--user=mysql --log-warnings=0 --basedir=/usr --datadir=/var/lib/mysql \
--max_allowed_packet=8M --net_buffer_length=16K \
--default-storage-engine=MyISAM \
--socket=/var/run/mysqld/mysqld99.sock \
--pid-file=/var/run/mysqld/mysqld99.pid \
--tmpdir=/tmp/ &
Verifique se o arquivo de soquete (acima) foi criado. Então:
$ /usr/bin/mysql --socket=/var/run/mysqld/mysqld99.sock -hlocalhost -e \
"UPDATE mysql.user SET Password = PASSWORD('your-password-here') WHERE USER='root'; FLUSH PRIVILEGES"
Aqui falha com:
ERROR 1054 (42S22) at line 1: Unknown column 'Password' in 'field list'
Encontrei a correção no estouro de pilha :
$ /usr/bin/mysql --socket=/var/run/mysqld/mysqld99.sock -hlocalhost -e \
"UPDATE mysql.user SET authentication_string = PASSWORD('your-password-here') WHERE USER='root'; FLUSH PRIVILEGES"
Por fim, finalize mysqld
:
$ kill $(< /var/run/mysqld/mysqld99.pid ) # from the --pid-file above
É isso. Agora você pode adicionar o MySQL a um runlevel ou iniciá-lo e pará-lo manualmente:
$ /etc/init.d/mysql start
$ /etc/init.d/mysql stop